Java ExecutorService JVM不';不要终止

Java ExecutorService JVM不';不要终止,java,multithreading,executorservice,java.util.concurrent,Java,Multithreading,Executorservice,Java.util.concurrent,我不明白为什么我要打电话给executorService.shutdown() 显式终止Executor服务 如果我不调用shutdown(),那么JVM将不会自行终止 我的程序有什么问题,或者我缺少什么概念? public class ExecutorServiceExample { public static class Task1 implements Runnable { @Override public void run() {

我不明白为什么我要打电话给executorService.shutdown() 显式终止Executor服务

如果我不调用shutdown(),那么JVM将不会自行终止

我的程序有什么问题,或者我缺少什么概念?

public class ExecutorServiceExample {

    public static class Task1 implements Runnable {

        @Override
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("Message from Task1 :"
                    + Thread.currentThread().getName());
        }

    }

    public static class Task2 implements Runnable {

        @Override
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Message from Task2 :"
                    + Thread.currentThread().getName());
        }

    }

    public static class Task3 implements Runnable {

        @Override
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Message from Task3 :"
                    + Thread.currentThread().getName());
        }

    }

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(10);

        Future future1 = executorService.submit(new Task1());
        Future future2 = executorService.submit(new Task2());
        Future future3 = executorService.submit(new Task3());


    }

}
输出:

来自Task2的消息:池1线程2

来自Task1的消息:池1线程1

来自Task3的消息:池1线程3

JVM仍处于活动状态。如果我调用shutdown(),那么只有JVM会死亡。

根据:

Java虚拟机将继续执行线程,直到发生以下任一情况:

  • 类运行时的exit方法已被调用,并且安全管理器已允许执行exit操作
  • 通过调用run方法返回或抛出传播到run方法之外的异常,所有非守护进程线程都已死亡
执行器创建非守护进程线程,防止JVM关闭。由执行器创建的线程通常被合并以运行提交给执行器的多个任务-这通常是一种性能优化,以重用线程,使它们运行多个任务(因为创建新线程是一项昂贵的操作)。根据执行器的实现和配置(例如,请参阅),它可能会使线程永远运行,或者在线程闲置一段时间后终止


您必须在执行器上调用
shutdown
,或者使用自定义(例如使用)创建它,线程工厂将在其中将新线程配置为守护进程线程。

但是当这些非守护进程线程完成run()的执行时,这些非守护进程线程将死亡。但我的情况并非如此。有什么建议吗?如果您使用ThreadFactory创建守护进程线程,那么当JVM退出时,提交的任务将不会完全执行。在问题的示例中,此选项将导致没有消息打印。@JohnRambo Non-deamon executor的线程在Runnable执行完成后不会死亡。他们等待提交另一个Runnable来执行。因为这就是它的工作方式,为什么不想遵循文档?因为文档中没有明确提到它。