当一个任务在Threadpool执行程序中返回无效时,如何取消任务中的所有线程

时间:2013-07-03 17:51:52

标签: java multithreading concurrency threadpoolexecutor

我提交给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()但这不是我想要的,因为它会阻止该特定任务直到完成,但是如果另一个任务已经完成并且结果失败怎么办? / p>

有效实现这一目标的方法有哪些?

编辑:可能重复的问题:In Java, how do I wait for all tasks, but halt on first error?

1 个答案:

答案 0 :(得分:0)

如果您使用ThreadPoolExecutor,它会提供一个钩子beforeExecute()。您可以使用它来检查原子标志(由失败的任务设置)以决定是否要取消给定的Runnable。实际上没有尝试过,但它可能会起作用。