java线程池七大参数包括corepoolsize、maximumpoolsize、keepalivetime、unit、workqueue、threadfactory和handler,共同决定线程创建、任务排队、资源回收与拒绝策略。

Java线程池的七大参数,是构建和调优 ThreadPoolExecutor 的关键入口。它们共同决定了线程如何创建、任务如何排队、资源如何回收、异常如何兜底。理解每个参数的职责边界,比死记硬背更重要。
corePoolSize:核心线程数,线程池的“基本盘”
这是线程池中长期存活的最小线程数量。只要没调用 shutdown(),这些线程即使空闲也不会被销毁(除非显式开启 allowCoreThreadTimeOut(true))。新任务提交时,线程池优先用现有核心线程处理;不够用时,才考虑入队或扩容。
- CPU 密集型任务:建议设为 CPU 核数 + 1,避免频繁上下文切换
- I/O 密集型任务:可设为 CPU 核数 / (1 − 阻塞系数),例如 4 核、阻塞系数 0.8 → 20 个核心线程
- 注意:线程池启动后不会立即创建 corePoolSize 个线程,而是“懒创建”——有任务来才逐步建
maximumPoolSize:最大线程数,应对突发流量的“弹性上限”
它不是“平时该有多少线程”,而是“极端情况下最多允许多少线程同时存在”。只有当 核心线程全忙 + 工作队列已满 时,才会触发创建非核心线程,且总数不能超过这个值。
- 必须 ≥ corePoolSize,否则构造时抛
IllegalArgumentException - 若用无界队列(如
LinkedBlockingQueue未指定容量),此参数实际失效——因为队列永远不满,永远不会扩容 - 设置过大易导致 CPU 过载、GC 压力大,甚至 OOM;过小则任务大量堆积或被拒绝
keepAliveTime + unit:非核心线程的“闲置容忍期”
这两个参数绑定使用:keepAliveTime 是数值,unit 是单位(如 TimeUnit.SECONDS)。它们只对 超出 corePoolSize 的线程 生效——即非核心线程空闲多久后自动销毁。
立即学习“Java免费学习笔记(深入)”;
- 默认只作用于非核心线程;若调用
allowCoreThreadTimeOut(true),核心线程也适用 - 设为 0 表示非核心线程空闲后立即回收(不等待)
- 典型值:60 秒、10 秒,根据业务峰谷周期调整
workQueue:任务的“缓冲区”,决定排队策略
这是一个 BlockingQueue<runnable></runnable>,用于暂存已提交但尚未执行的任务。它的类型直接改变线程池行为逻辑:
-
ArrayBlockingQueue(有界):容量固定,安全可控,推荐用于生产环境 -
LinkedBlockingQueue(默认无界):最大容量Integer.MAX_VALUE,容易掩盖问题,导致内存耗尽 -
SynchronousQueue(不缓存):相当于“手递手”,没有中间缓冲,适合高吞吐、低延迟场景 -
PriorityBlockingQueue:支持优先级调度,但不保证公平性,慎用于核心业务
threadFactory:线程的“身份证生成器”
负责创建新线程。默认用 Executors.defaultThreadFactory(),但生产环境强烈建议自定义:
- 给线程起有意义的名字(如
order-processor-pool-1),便于排查问题 - 统一设置为非守护线程(
setDaemon(false)),防止 JVM 退出时任务被意外中断 - 可设置线程组、优先级(一般保持默认即可,避免干扰调度)
handler:最后的“守门人”,拒绝策略
当线程池已关闭,或 核心线程全忙 + 队列已满 + 线程数已达 maximumPoolSize 时,新任务将被拒绝,此时 handler 决定怎么收场:
-
AbortPolicy(默认):抛RejectedExecutionException,快速失败,适合强一致性场景 -
CallerRunsPolicy:由提交任务的线程(比如主线程)自己执行该任务,可自然降速,避免雪崩 -
DiscardPolicy:静默丢弃,不报错不处理,适合日志、监控等非关键任务 -
DiscardOldestPolicy:丢掉队列里最老的一个任务,再尝试提交当前任务,适合实时性要求高的流式处理
基本上就这些。七个参数不是孤立配置,而是一套联动机制:任务来了先找核心线程,没空就进队列,队列满了再扩非核心线程,扩不动了就按策略拒绝。调优本质是平衡响应速度、资源消耗与系统稳定性。









