面试题答案
一键面试核心线程和非核心线程生命周期管理不同之处
- 创建
- 核心线程:当有任务提交到线程池时,核心线程会优先被创建,直至达到核心线程数。即使当前有空闲线程,新任务也可能创建新的核心线程,只要核心线程数未达到设定值。
- 非核心线程:只有当任务队列已满,且当前活动线程数小于最大线程数时,才会创建非核心线程来处理任务。
- 存活时间
- 核心线程:默认情况下会一直存活在线程池中,即使处于空闲状态,也不会被销毁,除非设置了
allowCoreThreadTimeOut(true)
。 - 非核心线程:如果非核心线程在一段时间内(
keepAliveTime
)没有任务执行,就会被销毁。
- 核心线程:默认情况下会一直存活在线程池中,即使处于空闲状态,也不会被销毁,除非设置了
- 销毁机制
- 核心线程:当调用
shutdown()
方法后,核心线程会在处理完已提交到任务队列中的任务后逐渐停止。若调用shutdownNow()
方法,核心线程会尝试停止当前正在执行的任务。当设置allowCoreThreadTimeOut(true)
且核心线程空闲时间超过keepAliveTime
时,核心线程也会被销毁。 - 非核心线程:在空闲时间超过
keepAliveTime
时,会被自动销毁。当调用shutdown()
或shutdownNow()
方法时,其处理逻辑与核心线程类似,但由于其本身空闲时会自动销毁,所以相对核心线程会更快停止。
- 核心线程:当调用
这种设计带来的优势
- 提高响应速度:核心线程常驻,新任务提交时无需等待线程创建,能立即执行任务,提高了任务处理的响应速度。
- 节省资源:非核心线程在任务量不饱和时,空闲一段时间后会被销毁,避免了资源浪费。当任务量增加时,又能动态创建非核心线程来处理任务,充分利用系统资源。
- 灵活控制资源:通过设置核心线程数、最大线程数和
keepAliveTime
等参数,可以灵活控制线程池对系统资源的使用,以适应不同的业务场景。
适用场景
- 高并发且任务执行时间短的场景:例如 Web 服务器处理 HTTP 请求,核心线程可以快速响应请求,非核心线程在并发量高时动态增加处理能力,任务完成后又能及时释放资源。
- 周期性任务场景:如定时任务调度,核心线程可以长期存活等待任务到来,保证任务能及时处理。非核心线程在任务高峰期辅助处理,任务结束后自动销毁,不会造成资源长期占用。