在Java的线程池实现中,如果你使用的是ThreadPoolExecutor
类,并且设置了核心线程数为2,最大线程数为5,以及第三个参数(即keepAliveTime)为60秒,那么线程池的行为如下:
-
核心线程:核心线程是指始终保持存活的线程,即使它们是空闲的。在你的例子中,核心线程数是2。
-
非核心线程:超过核心线程数的线程(在你的例子中是3个线程,因为最大线程数是5)被称为非核心线程。这些线程在空闲时间超过指定的keepAliveTime(在你的例子中是60秒)后会被终止和移除。
因此,当线程池中的线程在60秒内没有被占用时,会发生以下情况:
- 核心线程(2个)不会被销毁,它们会一直保持存活状态。
- 非核心线程(最多3个)会被销毁和移除。
总结来说,线程池会在60秒没有线程占用后销毁所有非核心线程,但会保留核心线程。
在Java中,线程池的核心线程默认情况下不会被销毁,即使它们处于空闲状态。核心线程会一直保持存活,以便能够立即处理新提交的任务。然而,在以下特定情况下,核心线程会被销毁:
那么,如何销毁核心线程池呢?
1. 调用线程池的 shutdown()
或 shutdownNow()
方法
shutdown()
:平滑关闭线程池,不再接受新任务,但会等待已提交的任务完成。所有线程(包括核心线程)在任务完成后会被销毁14。shutdownNow()
:立即尝试停止所有正在执行的任务,并返回未开始的任务列表。线程池中的线程(包括核心线程)会被中断并销毁1。
2. 设置 allowCoreThreadTimeOut(true)
并满足空闲条件
- 如果调用
allowCoreThreadTimeOut(true)
,则核心线程的行为会与非核心线程类似:当核心线程空闲时间超过keepAliveTime
时,会被销毁123。 - 例如,如果
corePoolSize=2
、keepAliveTime=60秒
,且设置了allowCoreThreadTimeOut(true)
,则核心线程在空闲60秒后会被销毁。
3. 线程池被回收或 JVM 退出
- 如果线程池所在的应用程序结束或 JVM 退出,所有线程(包括核心线程)会被自动销毁。
总结
- 默认情况:核心线程不会销毁,除非调用
shutdown()
或shutdownNow()
。 - 特殊情况:如果启用了
allowCoreThreadTimeOut(true)
,核心线程会在空闲时间超过keepAliveTime
后被销毁。 - 强制销毁:通过
shutdown()
或shutdownNow()
可以显式销毁所有线程(包括核心线程)。