我有以下代码哈希:
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
- 循环之后,我想等待所有工人完成,然后继续进行。什么是最好/最安全/最有效的方法?提前谢谢!
答案 0 :(得分:5)
countDown
await
,它将阻止,直到工人完成。这是一种比使用执行程序服务方法更通用的解决方案。
答案 1 :(得分:3)
您必须使用shutDown
关闭执行程序,然后等待所有作业都使用awaitTermination
处理。
答案 2 :(得分:3)
您可以致电:
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE , TimeUnit.NANOSECONDS);
这将(几乎)无限期地等待任务完成。
答案 3 :(得分:1)
有一种方便的方法。
ExecutorService.invokeAll(List<Callable> callables);
它将返回List<Future>
个对象,以便您可以获取所有单个call()
方法的返回对象。
您可以致电ExecutorService
Executors.new....()
的实例