可实时调用setCorePoolSize()修改核心线程数,增大时按需创建线程消费积压任务,减小时仅中断空闲线程且需开启allowCoreThreadTimeOut才及时缩容,须确保线程池处于RUNNING状态且新值合法。

增大核心线程数时的行为
当把核心线程数从 8 调到 20,线程池会:
- 立即更新内部 corePoolSize 数值
- 检查工作队列是否积压任务:如果有待处理任务,按需创建最多 min(增量, 队列长度) 个新线程去消费
- 如果队列为空,不会无意义地创建空闲线程——只等新任务来临时再按需启动
- 已运行中的任务不受影响,继续执行完毕
减小核心线程数时的行为
当把核心线程数从 20 调到 8,线程池会:
- 立即更新数值,但不会强制中断任何正在执行的线程
- 对空闲线程发起中断标记(
interruptIdleWorkers()),它们会在下次尝试从队列取任务(workQueue.take())时自然退出 - 若未开启
allowCoreThreadTimeOut(true),核心线程即使空闲也不会超时退出,缩容效果延迟甚至不明显 - 正在跑任务的线程照常完成,结束后不再被复用
必须注意的关键约束
调用前需确保满足以下条件,否则抛异常或无效:
- 线程池必须处于 RUNNING 状态:SHUTDOWN 后仍可调用,但不会再创建新线程;STOP/TIDYING/TERMINATED 状态下无实际作用
-
新值不能小于 0,也不能大于当前
maximumPoolSize(否则setCorePoolSize抛IllegalArgumentException) - 不要直接修改 workQueue 容量:没有安全的 setter,反射修改易导致状态不一致,官方明确不建议
- 避免激进调整:比如从 50 直降到 5,可能造成大量线程在后续几分钟内集中退出,引发短暂抖动
配合使用的实用技巧
让动态调整真正生效,光改数字还不够:
立即学习“Java免费学习笔记(深入)”;
- 提前调用
executor.allowCoreThreadTimeOut(true),使核心线程也能遵守keepAliveTime规则,缩容才更及时 - 高峰前可搭配
prestartAllCoreThreads()预热,避免扩容后首次任务触发线程创建延迟 - 结合 Nacos/Apollo 等配置中心监听变更,实现自动弹性伸缩,而不是靠人工 curl 接口或 JMX 手动调
- 务必监控
getActiveCount()、getQueue().size()、getPoolSize(),验证调整是否按预期落地


















