ExecutorService的shutdown()不会等待所有线程完成

我有一个代码,其中4个线程同时运行。我想等到所有这4个线程都结束。并且只有在那之后才能继续应用程序流程。

我尝试了两种方法:

  1. ,这种方法可以正常工作。之后的代码join()仅在所有线程完成后才执行。
  2. ,此技术允许执行代码,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实例上调用
  • 打完电话后shutdownservice通话awaitTerminationservice,直到它返回true
  • 而不是调用submitservice你添加Runnable实例到java.util.List这个列表传递给invokeAll呼吁方法service

以上是 ExecutorService的shutdown()不会等待所有线程完成 的全部内容, 来源链接: utcz.com/qa/419619.html

回到顶部