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() 的优点
其他方法
请记住,invokeAll() 要求您的任务实现 Callable。如果 ComputeDTask 是 Runnable,请将其包装为代码片段中所示或利用 Executors.callable()。
以上是如何高效地等待 ExecutorService 中的所有任务完成?的详细内容。更多信息请关注PHP中文网其他相关文章!