CodeWalk

ThreadPoolExecutor的线程复用机制

作者:孤独的心 · 2026-05-30 12:55

请说明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()

  1. 从workQueue.poll()或workQueue.take()获取任务。
  2. 核心线程→take()阻塞等待。
  3. 非核心线程→poll(keepAliveTime, unit)超时返回null。
  4. 返回null时Worker退出循环,线程销毁。

线程复用优势

  • 避免频繁创建/销毁线程的开销(Thread创建成本约1MB栈空间+OS调度开销)。
  • 控制并发线程数量,避免资源耗尽。

注意

  • Worker启动后一直运行while循环,直到池关闭或getTask()返回null。
  • Worker异常退出时,addWorker()会补充新Worker保持线程数。