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