首页 > Java > java教程 > 如何高效等待所有ExecutorService任务完成?

如何高效等待所有ExecutorService任务完成?

Barbara Streisand
发布: 2024-12-03 12:28:10
原创
187 人浏览过

How to Efficiently Wait for All ExecutorService Tasks to Finish?

等待 ExecutorService 任务完成

问题:

如何高效地等待所有的任务都提交给一个ExecutorService来完成?具体用例涉及在多个核心上执行的计算任务。

背景:

给定的代码片段利用 ExecutorService.wait(),但失败并出现 IllegalMonitorStateException。尽管任务执行成功,但等待操作似乎遇到了问题。

答案:

ExecutorService.invokeAll()

推荐的解决方案是使用ExecutorService.invokeAll()。它提供了一种等待所有任务完成的简单方法。这是修改后的代码示例:

ExecutorService es = Executors.newFixedThreadPool(2);
List<Callable<Object>> todo = new ArrayList<>(singleTable.size());

for (DataTable singleTable: uniquePhrases) {
    todo.add(Executors.callable(new ComputeDTask(singleTable)));
}

List<Future<Object>> answers = es.invokeAll(todo);
登录后复制

invokeAll() 行为

invokeAll() 将阻塞,直到所有任务完成。生成的答案集合包含表示每个任务的状态和潜在返回值的 Future。默认情况下,由 Executors.callable() 包装,这些 Future 将返回 null。但是,您可以修改ComputeDTask以实现Callable;提供有意义的返回值。

好处:

使用 invokeAll() 简化了代码并避免了与 wait() 相关的潜在竞争条件。它还允许 ExecutorService 在多个周期中重用。

相关问题:

要进一步说明,请考虑 Stack Overflow 上的以下相关问题:

  • [如何等待所有线程finish](https://stackoverflow.com/questions/13796491/how-to-wait-for-all-threads-to-finish)
  • [从 java 线程返回值](https://stackoverflow .com/questions/11937661/return-values-from-java-threads)
  • [invokeAll() 不愿意接受a Collection>](https://stackoverflow.com/questions/24168027/invokeall-not-willing-to-accept-a-collectioncallablet)
  • [我需要吗同步?](https://stackoverflow.com/questions/546386/do-i-need-to-synchronize)

以上是如何高效等待所有ExecutorService任务完成?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板