[英]How to wait for all callables to finish executing before proceeding?
我有以下代码哈希:
public class MyCallable implements Callable<Long> {
@Override
public Long call() throws Exception {
// Do stuff...
}
}
public class MyController {
private ExecutorService executor = Executos.newCachedTreadPool();
public Long concurrentDoStuff() {
List<MyCallable> workers = makeWorkers();
List<Long> allResults = new ArrayList<Long>();
for(MyCallable worker : workers) {
Future<Long> workerResults = executor.submit(worker);
try {
allResults.add(workerResults.get());
} catch(InterruptedException ie) {
// Handle...
} catch(ExecutionException ee) {
// Handle...
}
}
// Question: how do I pause here and wait for all workers to finish?
}
}
在for
-loop之后,我想等待所有工人完成任务以继续进行。 什么是最好/最安全/最有效的方法? 提前致谢!
使用CountDownLatch 。
countDown
await
,它将阻塞,直到工作完成。 与使用执行程序服务上的方法相比,这是一种更通用的解决方案。
您必须使用shutDown
关闭Executor,然后等待所有作业都使用awaitTermination
进行处理。
你可以打电话:
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE , TimeUnit.NANOSECONDS);
这将(几乎)无限期地等待任务完成。
有一种方便的方法。
ExecutorService.invokeAll(List<Callable> callables);
它将返回List<Future>
对象,以便您可以获取所有单个call()
方法的返回对象。
您可以通过调用Executors.new....()
来获取ExecutorService
的实例Executors.new....()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.