ExecutorService,如何等待所有任务完成

2024-03-19

等待所有任务的最简单方法是什么ExecutorService完成?我的任务主要是计算,所以我只想运行大量作业 - 每个核心一个。现在我的设置如下所示:

ExecutorService es = Executors.newFixedThreadPool(2);
for (DataTable singleTable : uniquePhrases) {   
    es.execute(new ComputeDTask(singleTable));
}
try{
    es.wait();
} 
catch (InterruptedException e){
    e.printStackTrace();
}

ComputeDTask实现可运行。这似乎正确执行了任务,但代码崩溃了wait() with IllegalMonitorStateException。这很奇怪,因为我玩了一些玩具示例,它似乎有效。

uniquePhrases含有数万个元素。我应该使用其他方法吗?我正在寻找尽可能简单的东西


最简单的方法是使用ExecutorService.invokeAll() https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#invokeAll-java.util.Collection-它可以在一行中完成你想要的事情。用你的话说,你需要修改或包装ComputeDTask实施Callable<>,这可以给你更多的灵活性。可能在您的应用程序中有一个有意义的实现Callable.call(),但如果不使用的话,这里有一种包装它的方法Executors.callable() https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executors.html#callable-java.lang.Runnable-.

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

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

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

正如其他人指出的那样,您可以使用超时版本invokeAll()如果合适的话。在这个例子中,answers将包含一堆Futures 将返回空值(参见定义Executors.callable()。也许您想要做的是稍微重构一下,这样您就可以获得有用的答案,或者对底层的引用ComputeDTask,但我无法从你的例子中看出。

如果不清楚,请注意invokeAll()直到所有任务完成后才会返回。 (即所有Future在你的answers收集将报告.isDone()如果询问的话。)这避免了所有手动关闭、awaitTermination 等...并允许您重用它ExecutorService如果需要的话,可以整齐地进行多个循环。

SO有几个相关问题:

  • 如何等待所有线程完成 https://stackoverflow.com/questions/1250643/java-how-to-wait-for-all-threads-to-finish

  • 从 java 线程返回值 https://stackoverflow.com/questions/2314402/return-values-from-java-threads

  • invokeAll() 不愿意接受 Collection> https://stackoverflow.com/questions/370707/invokeall-is-not-willing-to-acept-a-collectioncallablet

  • 我需要同步吗? https://stackoverflow.com/questions/1360936/do-i-need-to-synchronize-on-the-result-of-an-invokeall-call

这些都不是严格针对你的问题的,但它们确实提供了一些关于人们如何思考的色彩Executor/ExecutorService应该使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ExecutorService,如何等待所有任务完成 的相关文章

随机推荐