等待 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 上的以下相关问题:
以上是如何高效等待所有ExecutorService任务完成?的详细内容。更多信息请关注PHP中文网其他相关文章!