ThreadPoolExecutor 是 Java 中用于创建和管理线程池的核心类。它提供了高度可配置的线程池机制,允许开发者根据具体需求调整线程池的行为。下面是 ThreadPoolExecutor 的构造函数参数及其含义:
-
corePoolSize:
- 核心线程池大小。即使在空闲时也会保留的线程数,除非设置了
allowCoreThreadTimeOut。 - 当提交一个新任务时,如果当前运行的线程少于
corePoolSize,则会创建一个新线程来处理请求,即使其他线程处于空闲状态。
- 核心线程池大小。即使在空闲时也会保留的线程数,除非设置了
-
maximumPoolSize:
- 线程池允许的最大线程数。
- 当
corePoolSize已经满了,并且任务队列也满了的情况下,线程池会创建新线程,直到达到maximumPoolSize。
-
keepAliveTime:
- 当线程池中的线程数大于
corePoolSize时,多余的空闲线程的存活时间。 - 超过这个时间,空闲线程将会被终止。
- 当线程池中的线程数大于
-
unit:
keepAliveTime参数的时间单位。常用的时间单位有TimeUnit.SECONDS,TimeUnit.MILLISECONDS等。
-
workQueue:
- 用于保存等待执行的任务的队列。可以选择不同类型的队列来影响线程池的行为,比如:
LinkedBlockingQueue: 无界队列,任务会在corePoolSize满的情况下被存储在队列中。SynchronousQueue: 直接提交的队列,任务不会被实际保存,必须有一个空闲线程可以立即执行任务。ArrayBlockingQueue: 有界队列,任务会在corePoolSize满的情况下被存储在队列中,直到达到其容量限制。
- 用于保存等待执行的任务的队列。可以选择不同类型的队列来影响线程池的行为,比如:
-
threadFactory:
- 执行程序创建新线程时使用的工厂。可以通过自定义
ThreadFactory来设置线程的名称、优先级、是否为守护线程等。
- 执行程序创建新线程时使用的工厂。可以通过自定义
-
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 策略。
浙公网安备 33010602011771号