java—为什么executorservice等待所有线程完成,但不等待可完成的线程完成?

thigvfpy  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(454)

这个问题在这里已经有了答案

无法执行completablefuture。如果我使用executorservice池,它的工作与预期的一样,但不使用默认的forkjoin公共池(1个答案)
34分钟前关闭。
在以下代码中,

  1. class MainX {
  2. static void run(int i) {
  3. try {
  4. System.out.println(i + " called");
  5. Thread.sleep(1000);
  6. String s = "";
  7. for (int j = 0; j < 20000; j++) {
  8. s = s + j;
  9. }
  10. System.out.println(i + " completed" + " " + Thread.currentThread().getName());
  11. } catch (InterruptedException e) {
  12. e.printStackTrace();
  13. }
  14. }
  15. public static void main(String[] args) {
  16. ExecutorService executorService = Executors.newFixedThreadPool(10);
  17. for (int i = 0; i < 10; i++) {
  18. int p = i;
  19. executorService.submit(() -> MainX.run(p));
  20. }
  21. System.out.println("all called");
  22. executorService.shutdown();
  23. System.out.println("all called" + " Thr:" + Thread.currentThread().getName());
  24. }
  25. }

(vs)

  1. class MainX {
  2. static void run(int i) {
  3. try {
  4. System.out.println(i + " called");
  5. Thread.sleep(1000);
  6. String s = "";
  7. for (int j = 0; j < 20000; j++) {
  8. s = s + j;
  9. }
  10. System.out.println(i + " completed" + " " + Thread.currentThread().getName());
  11. } catch (InterruptedException e) {
  12. e.printStackTrace();
  13. }
  14. }
  15. public static void main(String[] args) {
  16. for(int i = 0; i < 10; i++) {
  17. int p = i;
  18. CompletableFuture.runAsync(() -> MainX.run(p));
  19. }
  20. }
  21. }

在第一种情况下,jvm会一直运行,直到所有线程都完成。但在第二种情况下,jvm和其他线程在主线程死亡后立即被杀死。
有什么原因吗?

lbsnaicq

lbsnaicq1#

在我看来,“completablefuture”本身不执行任何操作,因此它没有线程等待。它依赖于其他机制来运行阶段。
没有执行器的“runasync”在其公共forkjoin池中运行任务,该池被记录为具有您观察到的行为。
这并不能回答你关于“为什么”的问题,只是说它是故意这样设计的。我只能举手示意,说它的设计者可能认为它是最好的默认选择。
(我同意:在我编写的代码中,如果我达到程序终止的地步,我想要的是一切都消失。在极少数情况下,我需要完成它,我会在退出之前等待。)

相关问题