ThreadPoolExecutor に送信する任意の量のタスクがあります。これらの各タスクは、タスクが成功したかどうかに関係なく、コードを返します。私が望んでいるのは、失敗コードを返す最初のタスクが、他のすべてのタスクを無効化/キャンセル/中断することです。これは、時間を節約するためにすべてを短絡するのとほとんど同じです。失敗したタスクがない場合は、すべてのタスクが実行されます。タスクが割り込みを正常に処理するように設計されていると仮定します
for(int i = 0; i < size; i++) {
Future<?> future = executor.submit(new Runnable() {
@Override
public void run() {
returnValue = performWork();
if(returnValue == FAILED)
// signal cancel other tasks??
}
});
futureTaskList.add(future);
}
returnValue
をチェックして、失敗した値が返された場合は、残りのタスクの作業をキャンセルできるような良い設計を考えようとしています。
すべての先物をループして実行できますget()
が、特定のタスクが完了するまでブロックされるため、これは私が望むものではありませんが、別のタスクがすでに失敗した結果で完了した場合はどうなりますか?
これを最も効率的に達成する方法は何ですか?
編集:重複する可能性のある質問: Java では、すべてのタスクを待機し、最初のエラーで停止するにはどうすればよいですか?