Skip to content

线程池的七大参数?

Java 线程池(ThreadPoolExecutor)的七大参数如下: 1. corePoolSize:核心线程数,池中常驻线程。 2. maximumPoolSize:最大线程数,池中允许的最大线程数。 3. keepAliveTime:空闲线程存活时间,超出核心数的线程空闲多久被销毁。 4. unit:存活时间单位(如秒、毫秒)。 5. workQueue:任务队列,存储等待执行的任务。 6. threadFactory:线程工厂,定制线程创建。 7. handler:拒绝策略,队列满且线程满时的处理方式。

这些参数共同决定线程池的行为和性能。


1. 七大参数详解

(1) corePoolSize(核心线程数)

  • 定义
  • 线程池保持的最小线程数,即使空闲也不销毁(除非设置 allowCoreThreadTimeOut)。
  • 作用
  • 处理常规任务。
  • 示例
  • corePoolSize = 5,始终有 5 个线程待命。

(2) maximumPoolSize(最大线程数)

  • 定义
  • 线程池允许的最大线程数,包含核心线程和临时线程。
  • 作用
  • 应对任务高峰。
  • 示例
  • maximumPoolSize = 10,最多 10 个线程。

(3) keepAliveTime(空闲线程存活时间)

  • 定义
  • 非核心线程空闲超过该时间后被回收。
  • 作用
  • 节省资源。
  • 示例
  • keepAliveTime = 60,单位秒,空闲 60 秒销毁。

(4) unit(时间单位)

  • 定义
  • keepAliveTime 的单位。
  • 选项
  • TimeUnit.SECONDSTimeUnit.MILLISECONDS 等。
  • 示例
  • unit = TimeUnit.SECONDS

(5) workQueue(任务队列)

  • 定义
  • 存放待执行任务的队列,核心线程满后任务入队。
  • 常见类型
  • ArrayBlockingQueue:有界队列。
  • LinkedBlockingQueue:无界队列(默认)。
  • SynchronousQueue:直接提交。
  • 示例
  • new LinkedBlockingQueue<>(100),容量 100。

(6) threadFactory(线程工厂)

  • 定义
  • 创建线程的工厂,可定制线程名、优先级等。
  • 作用
  • 便于调试和管理。
  • 示例
ThreadFactory factory = r -> new Thread(r, "my-thread-" + counter.incrementAndGet());

(7) handler(拒绝策略)

  • 定义
  • 队列满且线程数达上限时的处理方式。
  • 默认策略
  • AbortPolicy:抛 RejectedExecutionException
  • 其他策略
  • CallerRunsPolicy:调用者线程执行。
  • DiscardPolicy:丢弃任务。
  • DiscardOldestPolicy:丢弃最老任务。
  • 示例
  • new ThreadPoolExecutor.AbortPolicy()

构造器

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    5,                  // corePoolSize
    10,                 // maximumPoolSize
    60,                 // keepAliveTime
    TimeUnit.SECONDS,   // unit
    new LinkedBlockingQueue<>(100), // workQueue
    Executors.defaultThreadFactory(), // threadFactory
    new ThreadPoolExecutor.AbortPolicy() // handler
);

2. 执行流程

  1. 任务提交
  2. 线程数 < corePoolSize:创建新线程。
  3. 核心满
  4. 任务入 workQueue
  5. 队列满
  6. 线程数 < maximumPoolSize:创建临时线程。
  7. 全满
  8. 执行 handler 的拒绝策略。

图示

任务 -> corePoolSize 未满 -> 新建核心线程
     -> 核心满 -> workQueue 未满 -> 入队
     -> 队列满 -> maximumPoolSize 未满 -> 新建临时线程
     -> 全满 -> 执行拒绝策略

3. 示例

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    2, 5, 30, TimeUnit.SECONDS,
    new ArrayBlockingQueue<>(3),
    Executors.defaultThreadFactory(),
    new ThreadPoolExecutor.DiscardPolicy()
);

for (int i = 0; i < 10; i++) {
    executor.execute(() -> {
        System.out.println(Thread.currentThread().getName());
        try { Thread.sleep(1000); } catch (Exception e) {}
    });
}
executor.shutdown();

4. 延伸与面试角度

  • 参数调优
  • CPU 密集corePoolSize = CPU 核心数 + 1
  • IO 密集corePoolSize = 2 * CPU 核心数
  • 队列:根据任务量选择有界/无界。
  • 实际应用
  • Web 服务器:处理请求。
  • 任务调度:批量处理。
  • 与 Executors
  • newFixedThreadPool:固定核心,无临时。
  • newCachedThreadPool:无核心,动态临时。
  • 面试点
  • 问“参数”时,逐一解释。
  • 问“流程”时,提执行顺序。

总结

线程池的七大参数控制线程数量、任务队列和异常处理,核心是 corePoolSizemaximumPoolSize,配合队列和策略优化并发。面试时,可写构造器或提调优,展示理解深度。