JAVA线程池原理源码解析—为什么启动一个线程池,提交一个任务后,Main方法不会退出?

本文分析了Java线程池在启动后,即使任务完成,主方法仍不退出的原因。关键在于线程池初始化时创建的第一个Worker线程包含死循环,不会自动终止,并被设置为非守护线程。由于JVM只有在所有非守护线程结束后才会退出,因此导致程序不会结束。通过源码解读,揭示了Worker线程的运行机制和非守护线程的设定。
摘要由CSDN通过智能技术生成

 

public static void main(String[] args) {

        ExecutorService service = Executors.newFixedThreadPool(10);

        service.submit(() -> System.out.println("Hello "));

        System.out.println("World");
    }
复制代码

呵呵,执行结果谁都知道,显而易见

但是小老弟,有没有发现这个程序 一直都没有结束

呢?明明这个任务都已经跑完了呀~

结论

开始了吗?不好意思已经结束了,嘻嘻,大过年的不卖关子,我们直接公布答案,造成不退出的原因是这样:

  • 你丑
  • 线程池的创建的时候,第一次 submit 操作会创建 Worker 线程(负责去拿任务处理),该线程里写了一个死循环,所以这个 Worker 线程不会死
  • Worker 线程在创建的时候,被设置成了 非守护线程 , thread.setDaemon(false)
  • 早在 JDK1.5 的时候,就规定了当所有非守护线程退出时, JVM 才会退出, Main 方法主线程和 Worker 线程都是非守护线程,所以不会死。

下面我们会就上面几个问题,每一个问题进行源码分析,感兴趣的看官老爷可以继续,看看又不会掉发(逃

源码分析

为什么Worker线程不会死

梦开始的地方先从初始化开始

//该方法利用多台实例化了一个ThreadPoolExecutor线程池,该线程池继承了一个抽象类AbstractExecutorService
ExecutorService service = Executors.newFixedThreadPool(10);
//调用了ThreadPoolExecutor.submit方法也就是父类的AbstractExecutorService.submit,该方法内部会去调用execute
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值