0

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 では、すべてのタスクを待機し、最初のエラーで停止するにはどうすればよいですか?

4

1 に答える 1

0

を使用するThreadPoolExecutorと、フックが提供されますbeforeExecute()。これを使用して、アトミック フラグ (失敗したタスクによって設定された) をチェックし、指定された をキャンセルするかどうかを決定できますRunnable。実際に試したことはありませんが、うまくいくかもしれません。

于 2013-07-03T18:00:47.110 に答える