Java线程池通过Worker类的无限循环与阻塞队列协作实现线程复用:Worker启动后先执行firstTask,随后循环调用getTask()从队列取任务,核心线程永久阻塞等待,非核心线程超时未取到则退出,线程存续由corePoolSize、keepAliveTime等参数协同控制。

Java 线程池实现线程复用,核心在于 Worker 类的无限循环 + 阻塞队列的协作机制,不是靠反复新建线程,而是让同一线程持续“取任务—执行—再取任务”。
Worker 是复用的执行主体
Worker 是 ThreadPoolExecutor 的内部类,它本身实现了 Runnable,并持有一个 Thread 对象:
- 创建 Worker 时可绑定一个初始任务(firstTask),线程启动后先执行它
- firstTask 执行完,立刻进入循环:while (task != null || (task = getTask()) != null)
- 这个 while 循环不会退出,除非 getTask() 返回 null —— 意味着该线程该结束了
- Worker 继承 AQS,用 state 字段原子控制中断状态,不依赖传统锁,轻量高效
阻塞队列是任务中转与等待枢纽
任务不直接交给线程,而是先进入阻塞队列(如 LinkedBlockingQueue、SynchronousQueue):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 核心线程调用 take() 方法:永久阻塞,直到队列有任务才返回
- 非核心线程调用 poll(keepAliveTime, unit):超时未取到任务就返回 null,触发线程退出
- 队列为空时,核心线程不退出,只是挂起等待;非核心线程则可能因超时被回收
- 队列容量直接影响复用效果:无界队列易积压,小容量队列更早触发扩容或拒绝
复用行为由线程数与参数协同控制
是否复用、复用多久,取决于当前线程数量和配置参数:
立即学习“Java免费学习笔记(深入)”;
- 线程数 ≤ corePoolSize:线程默认长期存活,即使空闲也不退出(除非 allowCoreThreadTimeOut = true)
- 线程数 > corePoolSize:这些非核心线程空闲超过 keepAliveTime 就自动终止,实现弹性收缩
- 任务提交后,优先复用空闲线程;没有空闲线程时,才考虑入队或新建线程
- shutdown 后,已存在的线程会处理完队列中剩余任务再退出;stop 则直接中断所有线程
整个过程就是一次“预创建—循环取—按需退”
线程池不是为每个任务分配新线程,而是:
- 启动时按需创建核心线程(不预热全部)
- 每个 Worker 启动后,永远在循环里等下一个任务
- 任务来了进队列,Worker 从队列里拿,拿到就 run(),拿不到就等或退
- 线程生命周期由 getTask() 的返回值决定,而不是单个任务的结束

















