スレッドプールを作成していますが、スレッドからの出力は必要ないため、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 を使用していない限り、スレッドプールが私が提出しているタスクを使用していると私に信じさせます。
そのような行動を見たことがありますか?これをデバッグするより良い方法はありますか?