线程池中工作线程的回收是线程池管理的核心功能之一,主要通过以下机制实现:
一、核心回收机制
1. 空闲线程超时回收(适用于非核心线程)
ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, // 核心线程数
10, // 最大线程数
60, // 空闲线程存活时间(秒)
TimeUnit.SECONDS,
new LinkedBlockingQueue<>()
);
回收过程:
- 当线程池中的线程数量超过核心线程数时
- 这些"非核心线程"在空闲时间超过
keepAliveTime
后会被回收 - 核心线程默认不会被回收(除非配置
allowCoreThreadTimeOut
)
2. 核心线程超时回收(需显式开启)
executor.allowCoreThreadTimeOut(true); // 允许回收核心线程
特点:
- 核心线程也会在空闲超过
keepAliveTime
后被回收 - 慎用此设置,因为频繁创建/销毁核心线程会影响性能
二、线程回收的底层实现
1. 工作线程运行逻辑
线程池中的工作线程(Worker)执行流程:
final void