ThreadPoolExecutor的线程复用机制
请说明ThreadPoolExecutor如何实现线程复用?Worker线程的生命周期是怎样的?
回答
孤独的心
线程复用核心机制:
- 线程池中的工作线程(Worker)不直接执行任务后就销毁,而是不断从阻塞队列获取新任务执行。
- Worker本身实现了AQS,内部持有Thread线程引用。
Worker运行流程:
// Worker.runWorker() 核心循环
while (task != null || (task = getTask()) != null) {
beforeExecute(wt, task);
task.run();
afterExecute(task, null);
}
// 线程退出
processWorkerExit(w, completedAbruptly);
getTask():
- 从workQueue.poll()或workQueue.take()获取任务。
- 核心线程→take()阻塞等待。
- 非核心线程→poll(keepAliveTime, unit)超时返回null。
- 返回null时Worker退出循环,线程销毁。
线程复用优势:
- 避免频繁创建/销毁线程的开销(Thread创建成本约1MB栈空间+OS调度开销)。
- 控制并发线程数量,避免资源耗尽。
注意:
- Worker启动后一直运行while循环,直到池关闭或getTask()返回null。
- Worker异常退出时,addWorker()会补充新Worker保持线程数。