为什么线程池执行完任务不会自动关闭?

发布时间 2023-06-30 15:12:16作者: xfcoding

想搞清楚这个问题,需要先看线程池原理:?线程池原理

原因是,池子中已有线程数不超过核心线程数的前提下,线程池每添加一个任务,就会 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 方法中执行完线程池代码,虚拟机不会退出。这是并发编程,主线程执行完了,子线程还在执行呢。

什么情况下线程池能自动关闭,线程池原理中已经阐述了。