ExecutorService的shutdown()不会等待所有线程完成
我有一个代码,其中4个线程同时运行。我想等到所有这4个线程都结束。并且只有在那之后才能继续应用程序流程。
我尝试了两种方法:
- ,这种方法可以正常工作。之后的代码
join()
仅在所有线程完成后才执行。 - ,此技术允许执行代码,
shutdown()
即使并非所有线程都已完成,也可以执行代码。
代码示例:
ExecutorService service = Executors.newFixedThreadPool(cpuCoresNum);for (int i = 0; i < cpuCoresNum; i++) {
service.submit(() -> {
try {
foo(); // some long execution function
} catch (Exception e) {
e.printStackTrace();
}
});
}
service.shutdown();
System.out.println("We're done! All threads are finished!");
- 为什么
submit()
并且shutdown()
不要等到所有线程都完成并打印出来 _«我们完成了! 所有线程都完成了!» _刚打完电话service.shutdown();
?
回答:
答案可以在ExecutorService.shutdown()
Javadoc中找到:
此方法不等待先前提交的任务完成执行。使用
awaitTermination
做到这一点。
如果要等待线程完成工作,则可以使用以下选项:
- 获取
Future
实例返回submit()
并get()
在每个Future
实例上调用 - 打完电话后
shutdown
对service
通话awaitTermination
上service
,直到它返回true
- 而不是调用
submit
在service
你添加Runnable
实例到java.util.List
这个列表传递给invokeAll
呼吁方法service
以上是 ExecutorService的shutdown()不会等待所有线程完成 的全部内容, 来源链接: utcz.com/qa/419619.html