ThreadPoolExecutor 核心参数

Abstract

ThreadPoolExecutor 是 Java 线程池的核心实现类,理解其七大连参是掌握线程池的基本功

构造方法签名

public ThreadPoolExecutor(
    int corePoolSize,                // 核心线程数
    int maximumPoolSize,             // 最大线程数
    long keepAliveTime,              // 空闲线程存活时间
    TimeUnit unit,                   // 时间单位
    BlockingQueue<Runnable> workQueue,  // 工作队列
    ThreadFactory threadFactory,         // 线程工厂
    RejectedExecutionHandler handler     // 拒绝策略(见 [[线程池拒绝策略]])
)

七大连参详解

1. corePoolSize(核心线程数)

  • 即使空闲也保留在线程池中的线程数量
  • 除非设置了 allowCoreThreadTimeOut(true),否则核心线程不会因空闲被回收

2. maximumPoolSize(最大线程数)

  • 线程池允许的最大线程数量
  • 当工作队列满且当前线程数 < maximumPoolSize 时,创建新线程

3. keepAliveTime + TimeUnit(空闲存活时间)

  • 非核心线程空闲超过该时间会被回收
  • 核心线程可通过 allowCoreThreadTimeOut(true) 启用超时回收

4. workQueue(工作队列)

5. threadFactory(线程工厂)

  • 用于创建新线程,可自定义线程名称、是否为守护线程等

6. handler(拒绝策略)

工作流程

提交任务
    ↓
核心线程数是否已满?
├── 否 → 创建新核心线程执行任务
└── 是 → 工作队列是否已满?
          ├── 否 → 将任务加入队列
          └── 是 → 线程数是否达到最大?
                    ├── 否 → 创建非核心线程执行任务
                    └── 是 → 执行拒绝策略([[线程池拒绝策略]])

流程理解要点

线程池不是在 corePoolSize 满了后立即创建新线程,而是先将任务放入队列。只有当队列也满了,才会创建非核心线程。这种设计优先考虑”排队等待”而非”创建新线程”。

工作队列类型

队列类型特点风险
ArrayBlockingQueue有界队列,固定容量队列满时触发拒绝策略
LinkedBlockingQueue默认无界(Integer.MAX_VALUE可能导致 OOM(见 JVM内存溢出预防
SynchronousQueue直接移交,无缓冲需要足够的最大线程数
PriorityBlockingQueue优先级队列无界,可能 OOM

队列选择关乎系统稳定性

使用无界队列时,一旦任务生产速度 > 消费速度,队列无限增长 → 内存溢出(OOM)。因此生产环境强烈建议使用有界队列

线程池的优势

特性说明
降低开销避免线程创建/销毁的频繁开销
提高响应任务到达时无需等待线程创建
可控并发限制最大并发数,防止资源耗尽
便于管理统一管理线程生命周期和任务队列

继续阅读