ThreadPoolExecutor 是 Java 中用于创建和管理线程池的核心类。它提供了高度可配置的线程池机制,允许开发者根据具体需求调整线程池的行为。下面是 ThreadPoolExecutor 的构造函数参数及其含义:

  1. corePoolSize:

    • 核心线程池大小。即使在空闲时也会保留的线程数,除非设置了 allowCoreThreadTimeOut
    • 当提交一个新任务时,如果当前运行的线程少于 corePoolSize,则会创建一个新线程来处理请求,即使其他线程处于空闲状态。
  2. maximumPoolSize:

    • 线程池允许的最大线程数。
    • 当 corePoolSize 已经满了,并且任务队列也满了的情况下,线程池会创建新线程,直到达到 maximumPoolSize
  3. keepAliveTime:

    • 当线程池中的线程数大于 corePoolSize 时,多余的空闲线程的存活时间。
    • 超过这个时间,空闲线程将会被终止。
  4. unit:

    • keepAliveTime 参数的时间单位。常用的时间单位有 TimeUnit.SECONDSTimeUnit.MILLISECONDS 等。
  5. workQueue:

    • 用于保存等待执行的任务的队列。可以选择不同类型的队列来影响线程池的行为,比如:
      • LinkedBlockingQueue: 无界队列,任务会在 corePoolSize 满的情况下被存储在队列中。
      • SynchronousQueue: 直接提交的队列,任务不会被实际保存,必须有一个空闲线程可以立即执行任务。
      • ArrayBlockingQueue: 有界队列,任务会在 corePoolSize 满的情况下被存储在队列中,直到达到其容量限制。
  6. threadFactory:

    • 执行程序创建新线程时使用的工厂。可以通过自定义 ThreadFactory 来设置线程的名称、优先级、是否为守护线程等。
  7. handler:

    • 当线程边界和队列容量都满时用于处理拒绝任务的策略。ThreadPoolExecutor 提供了几种默认的策略:
      • AbortPolicy: 抛出 RejectedExecutionException 来拒绝新任务。
      • CallerRunsPolicy: 由调用线程处理该任务。
      • DiscardPolicy: 丢弃无法处理的任务。
      • DiscardOldestPolicy: 丢弃队列中最旧的未处理任务,然后重试执行程序(如果执行程序未关闭)。

示例

import java.util.concurrent.*;

public class ThreadPoolExample {
    public static void main(String[] args) {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
            2, // corePoolSize
            4, // maximumPoolSize
            60, // keepAliveTime
            TimeUnit.SECONDS, // unit
            new LinkedBlockingQueue<>(100), // workQueue
            Executors.defaultThreadFactory(), // threadFactory
            new ThreadPoolExecutor.AbortPolicy() // handler
        );

        // 提交任务给线程池
        executor.submit(() -> {
            System.out.println("Task executed");
        });

        // 关闭线程池
        executor.shutdown();
    }
}

在这个示例中,线程池被配置为具有 2 个核心线程,最多 4 个线程,使用 LinkedBlockingQueue 作为任务队列,并在任务无法执行时采用 AbortPolicy 策略。

posted on 2025-04-01 16:46  卡米i  阅读(15)  评论(0)    收藏  举报