1

スレッドプールを作成していますが、スレッドからの出力は必要ないため、Futures&Callables は使用していません。しかし問題は、Futures を使用しない場合、スレッドプールが送信中のタスクを失っていることです。

これがタスクを失っている私のコード構造です-

while(hasWorkToDo){
ThreadPoolExecutor.execute(new Worker());
System.out.println("Work submitted");
}

Worker() 内で、run() 実装の最初の行に「got work」と出力しています。

上記のコードを実行すると、「取得した作業」の数は常に「提出された作業」よりも少なくなります。

しかし、コード構造を以下に変更すると、

ArrayList<Future<String>> list = new ArrayList<Future<String>>();
while(hasWorkToDo){
Future<String> submit=ThreadPoolExecutor.submit(new Worker());
list.add(submit) 
}

for (Future<String> f : list) {
f.get();
}

次に、「作業を取得した」回数と「作業を送信した」回数が等しいことがわかります

これは、私が Futures&Callables を使用していない限り、スレッドプールが私が提出しているタスクを使用していると私に信じさせます。

そのような行動を見たことがありますか?これをデバッグするより良い方法はありますか?

4

2 に答える 2

0

Future タスクを保持する必要はなく、Executor をシャットダウンする前にそれらが完了するのを待つ必要はありません。shutdownNow() をどこかで使用していると思われます。代わりに shutdown() を使用してみてください。

于 2012-04-10T13:01:51.193 に答える
0

AThreadPoolExecutorがシャットダウンされている場合、または容量に達している場合、A はタスクを拒否することがあります。setRejectedExectutionHandlerタスクが拒否されているかどうかをテストするために使用できます。

于 2012-04-10T13:47:29.633 に答える