【发布时间】:2012-08-09 12:24:42
【问题描述】:
我有一个处理较大作业的 JobService。作业被动态细分为多个任务,任务也可能产生子任务等,因此无法预测一个作业的任务总数。每个任务排队通过ExecutorService.submit(...) 运行。问题是我似乎必须为每个作业创建一个单独的 ExecutorService,因为判断“作业队列”何时完成的唯一方法是使用ExecutorService.awaitTermination(...)。不过这似乎效率低下,因为在作业和它们的 ExecutorService 之间有I can't share a single threadpool。
我正在寻找一些替代方案,我正在考虑为每项工作使用 AtomicInteger。提交新任务时递增,任务完成时递减。但是我必须轮询它什么时候为零,这看起来很混乱,还有一些异常处理混乱。
看来一定有更好的解决方案?
【问题讨论】:
-
你检查过
CompletionService吗?您可以将submit与将其与正在完成的Job关联的值一起使用。 -
查看the javadoc of ExecutorCompletionService 以获取示例代码。
-
我确实看过
CompletionService,但这似乎不是我想要的,因为我不关心处理个别结果,我只想知道它们什么时候完成,所以 poll()/take() 一个一个看起来很乱,我真的只想知道completionQueue什么时候是空的。也许我应该考虑扩展它以达到我的目的。 -
你看过ExecutorSerice的invokeAll方法吗?不确定这是否能满足您的需求
-
InvokeAll 是我最初使用的,但问题是我提交给 invokeAll 的一些任务会反过来提交更多任务,我也需要知道它们何时完成。
标签: java concurrency threadpool