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

如果你使用 a ThreadPoolExecutor,它提供了一个钩子beforeExecute()。您可以使用它来检查原子标志(由失败的任务设置)来决定是否要取消给定的Runnable. 还没有真正尝试过,但它可能只是工作。

于 2013-07-03T18:00:47.110 回答