本文最后更新于 2025-11-19,文章内容可能已经过时。

ThreadPoolExecutor 类在 Java 中提供了 四个构造器(constructors),它们都是互相调用的重载形式,最终都调用最完整的那个 7 参数构造器。

下面我将逐一解释这四个构造器的作用、参数含义以及使用场景:


📌 构造器总览

1. ThreadPoolExecutor(int corePoolSize,
                      int maximumPoolSize,
                      long keepAliveTime,
                      TimeUnit unit,
                      BlockingQueue<Runnable> workQueue)

2. ThreadPoolExecutor(int corePoolSize,
                      int maximumPoolSize,
                      long keepAliveTime,
                      TimeUnit unit,
                      BlockingQueue<Runnable> workQueue,
                      ThreadFactory threadFactory)

3. ThreadPoolExecutor(int corePoolSize,
                      int maximumPoolSize,
                      long keepAliveTime,
                      TimeUnit unit,
                      BlockingQueue<Runnable> workQueue,
                      RejectedExecutionHandler handler)

4. ThreadPoolExecutor(int corePoolSize,
                      int maximumPoolSize,
                      long keepAliveTime,
                      TimeUnit unit,
                      BlockingQueue<Runnable> workQueue,
                      ThreadFactory threadFactory,
                      RejectedExecutionHandler handler)

注意:第 4 个是 主构造器(full constructor),其他三个都是它的简化版本,内部会调用它并传入默认值。


🔹 构造器 1:5 参数版(最简)

public ThreadPoolExecutor(
    int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue)

默认值:

  • threadFactory → Executors.defaultThreadFactory()
  • handler → new ThreadPoolExecutor.AbortPolicy()

特点:

  • 使用 JDK 默认线程工厂(线程名为 pool-N-thread-M)
  • 拒绝策略为 AbortPolicy(任务被拒绝时抛出异常)

适用场景:

  • 快速创建一个基础线程池,对线程命名和拒绝策略无特殊要求
  • 适合学习或简单 demo

示例:

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    2, 4, 60L, TimeUnit.SECONDS,
    new ArrayBlockingQueue<>(10)
);

🔹 构造器 2:6 参数版(自定义线程工厂)

public ThreadPoolExecutor(
    int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue,
    ThreadFactory threadFactory)

默认值:

  • handler → new ThreadPoolExecutor.AbortPolicy()

特点:

  • 允许你 自定义线程创建方式(如设置线程名、优先级、是否守护线程等)
  • 拒绝策略仍为默认的 AbortPolicy

为什么重要?

  • 自定义线程名对 日志排查、监控、线程 dump 分析 至关重要!
  • 例如:"order-service-pool-1" 比 "pool-1-thread-1" 清晰得多

示例:

ThreadFactory factory = r -> {
    Thread t = new Thread(r, "my-task-thread-" + Thread.currentThread().getId());
    t.setDaemon(false);
    return t;
};

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    2, 4, 60L, TimeUnit.SECONDS,
    new LinkedBlockingQueue<>(50),
    factory
);

🔹 构造器 3:6 参数版(自定义拒绝策略)

public ThreadPoolExecutor(
    int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue,
    RejectedExecutionHandler handler)

默认值:

  • threadFactory → Executors.defaultThreadFactory()

特点:

  • 允许你 自定义任务被拒绝时的行为
  • 线程仍使用默认工厂创建

适用场景:

  • 需要控制高负载下的降级行为(如记录日志、发送告警、fallback 处理)
  • 不希望直接抛异常导致业务中断

示例:

RejectedExecutionHandler handler = (r, executor) -> {
    System.err.println("Task rejected: " + r.toString());
    // 可存入数据库或异步队列后续重试
};

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    2, 4, 60L, TimeUnit.SECONDS,
    new ArrayBlockingQueue<>(10),
    handler
);

🔹 构造器 4:7 参数版(完整版,推荐生产使用)

public ThreadPoolExecutor(
    int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue,
    ThreadFactory threadFactory,
    RejectedExecutionHandler handler)

特点:

  • 完全可控:你可以指定所有关键行为
  • 是前三个构造器的底层实现(其他构造器都调用它)

推荐用于:

  • 生产环境
  • 对线程池行为有严格要求的系统(如金融、电商、高并发服务)

完整示例(生产级配置):

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    8,                                      // corePoolSize
    16,                                     // maximumPoolSize
    60L,                                    // keepAliveTime
    TimeUnit.SECONDS,
    new ArrayBlockingQueue<>(1000),         // 有界队列,防止 OOM
    new ThreadFactoryBuilder()              // 自定义线程工厂
        .setNameFormat("payment-pool-%d")
        .setDaemon(false)
        .build(),
    new ThreadPoolExecutor.CallerRunsPolicy() // 调用者运行策略,避免任务丢失
);

🔄 四个构造器的关系(源码视角)

在 JDK 源码中,前三个构造器都是这样实现的:

// 构造器1
public ThreadPoolExecutor(int corePoolSize, ..., BlockingQueue<Runnable> workQueue) {
    this(corePoolSize, ..., workQueue, 
         Executors.defaultThreadFactory(), 
         defaultHandler); // AbortPolicy
}

// 构造器2
public ThreadPoolExecutor(int corePoolSize, ..., ThreadFactory threadFactory) {
    this(corePoolSize, ..., 
         Executors.defaultThreadFactory(), 
         defaultHandler);
}

// 构造器3
public ThreadPoolExecutor(int corePoolSize, ..., RejectedExecutionHandler handler) {
    this(corePoolSize, ..., 
         Executors.defaultThreadFactory(), 
         handler);
}

所以,所有构造器最终都调用第 4 个构造器


✅ 总结对比表

构造器参数数量可自定义项默认值推荐使用场景
15默认线程工厂 + AbortPolicy学习、简单测试
26✅ 线程工厂AbortPolicy需要清晰线程名
36✅ 拒绝策略默认线程工厂需要自定义降级逻辑
47✅✅ 全部生产环境首选

🚨 重要提醒

  • 不要使用 Executors 工厂方法(如 newFixedThreadPool),因为它们内部使用了 无界队列,容易导致 OOM。
  • 生产环境务必使用第 4 个构造器,显式指定队列大小、线程工厂和拒绝策略。
  • 配置后一定要进行 压力测试 + 监控(如通过 JMX 或 Micrometer 暴露线程池指标)。

💡 记住:线程池不是“开箱即用”的组件,而是需要根据业务特性精细调优的并发基础设施。