我提交给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?
答案 0 :(得分:0)
如果您使用ThreadPoolExecutor
,它会提供一个钩子beforeExecute()
。您可以使用它来检查原子标志(由失败的任务设置)以决定是否要取消给定的Runnable
。实际上没有尝试过,但它可能会起作用。