在Java中,我如何等待所有任务,但在第一个错误时停止?

时间:2009-09-10 01:41:13

标签: java multithreading concurrency

我有一系列并发任务要运行。如果其中任何一个失败,我想中断它们并等待终止。但假设它们都没有失败,我想等待所有这些都完成。

ExecutorCompletionService看起来几乎就像我想要的那样,但似乎没有办法判断我的所有任务是否都已完成,除非单独计算任务数量。 (请注意,Javadoc for ExecutorCompletionService中的两个示例都跟踪任务的计数“n”,并使用它来确定服务是否已完成。)

我是否忽略了某些内容,或者我是否真的必须自己编写此代码?

2 个答案:

答案 0 :(得分:2)

是的,如果您正在使用ExecutorCompletionService,则需要跟踪。通常,您可以在期货上调用get()来查看是否发生了错误。如果没有迭代任务,你怎么能告诉那个失败?

答案 1 :(得分:1)

如果您的一系列任务具有已知大小,那么您应该使用javadoc中的第二个示例。

但是,如果您不知道要提交给CompletionService的任务数,那么您会遇到一种Producer-Consumer问题。一个线程正在生成任务并将它们放在ECS中,另一个线程将通过take()消耗任务期货。可以使用共享的Semaphore,允许Producer调用release(),Consumer调用acquire()。完成语义将取决于您的应用程序,但生成器上的volatile或原子布尔值表示它已完成就足够了。

我建议使用poll()进行等待/通知的信号量,因为在生成任务的时间和任务的未来可供使用的时间之间存在非确定性延迟。因此,消费者和生产者需要稍微聪明一些。