想搞清楚这个问题,需要先看线程池原理:?线程池原理
原因是,池子中已有线程数不超过核心线程数的前提下,线程池每添加一个任务,就会 new 一个Worker线程,Worker线程启动后,会不断轮询,从阻塞队列中取任务,因为已有线程数不超过核心线程数、也不允许回收核心线程,所以看代码:
private Runnable getTask() {
...
boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;
...
Runnable r = timed ? workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) : workQueue.take();
}
timed就为false,三元表达式执行workQueue.take(),这个方法会一直阻塞,因为这时候队列是空的,直到队列中有任务为止。所以该Worker线程一直在运行。
这也是为什么我们在 main 方法中执行完线程池代码,虚拟机不会退出。这是并发编程,主线程执行完了,子线程还在执行呢。
什么情况下线程池能自动关闭,线程池原理中已经阐述了。