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

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-10 16:01:11865浏览

How Can I Efficiently Wait for All Tasks to Complete in an ExecutorService?

ExecutorService:等待任务完成

ExecutorService 是一个高效任务执行的便捷工具,但暂停直到所有任务完成可能会很棘手。让我们深入探讨一个常见问题及其实际解决方案。

wait() 中的错误

引用的代码片段使用固定线程池 ExecutorService,体验尝试使用 es.wait() 时出现 IllegalMonitorStateException。发生这种情况是因为 wait() 旨在与特定线程同步习惯用法一起使用,而不是与 ExecutorService 一起使用。

最简单的解决方案:invokeAll()

ExecutorService 为这个目的:invokeAll()。此方法获取可调用任务的集合,并行执行它们,并阻塞直到所有任务完成。使用方法如下:

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

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

List<Future<Object>> answers = es.invokeAll(todo);

invokeAll() 返回一个 Future 对象列表,每个对象代表一个单独的任务。一旦所有任务完成,访问任何 Future 的 isDone() 将返回 true。

invokeAll() 的优点

  • 阻塞,直到所有任务完成。
  • 避免手动关闭和同步。
  • 允许重复使用ExecutorService用于多个任务循环。

其他方法

  • 也可以使用shutdown()和awaitTermination(),但需要手动关闭处理.
  • submit(Callable) 可用于单个任务提交,但需要手动跟踪任务

请记住,invokeAll() 要求您的任务实现 Callable。如果 ComputeDTask 是 Runnable,请将其包装为代码片段中所示或利用 Executors.callable()。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn