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

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

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

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

class MainX {

    static void run(int i) {
        try {
            System.out.println(i + " called");
            Thread.sleep(1000);
            String s = "";
            for (int j = 0; j < 20000; j++) {
                s = s + j;
            }
            System.out.println(i + " completed" + " " + Thread.currentThread().getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 10; i++) {
            int p = i;
            executorService.submit(() -> MainX.run(p));
        }
        System.out.println("all called");
        executorService.shutdown();
        System.out.println("all called" + " Thr:" + Thread.currentThread().getName());
    }
}

(vs)

class MainX {

    static void run(int i) {
        try {
            System.out.println(i + " called");
            Thread.sleep(1000);
            String s = "";
            for (int j = 0; j < 20000; j++) {
                s = s + j;
            }
            System.out.println(i + " completed" + " " + Thread.currentThread().getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        for(int i = 0; i < 10; i++) {
            int p = i;
            CompletableFuture.runAsync(() -> MainX.run(p));
        }
    }
}

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

lbsnaicq

lbsnaicq1#

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

相关问题