ThreadPoolExecutor 是 Java 中一个非常灵活和强大的线程池工具,允许你精确控制线程池的行为。在 Java 8 中,ThreadPoolExecutor 的构造函数主要有以下几种重载形式,但它们通常都包含一组核心的参数,这些参数用于配置线程池的行为:
- 核心线程数 (corePoolSize):
- 线程池的基本大小,即在没有任务需要执行时线程池的大小。
即使线程是空闲的,核心线程也不会被终止,除非设置了 allowCoreThreadTimeOut 为 true。
- 线程池的基本大小,即在没有任务需要执行时线程池的大小。
- 最大线程数 (maximumPoolSize):
- 线程池允许的最大线程数。当工作队列已满,且当前线程数小于 maximumPoolSize 时,线程池会创建新的线程来处理任务。
- 存活时间 (keepAliveTime):
- 当线程数大于核心线程数时,这是多余的空闲线程在终止前等待新任务的最长时间。
- 时间单位是 TimeUnit,例如 TimeUnit.SECONDS。
- 时间单位 (TimeUnit):
- 用于 keepAliveTime 的时间单位,如 SECONDS, MILLISECONDS 等。
- 工作队列 (BlockingQueue):
- 用于保存待执行的任务的队列。
- 当提交的任务数超过 corePoolSize 时,新任务会被放在队列中等待执行。
- 常用的队列类型有 ArrayBlockingQueue, LinkedBlockingQueue, SynchronousQueue 等。
- 线程工厂 (ThreadFactory):
- 用于创建新线程的工厂。
- 可以自定义线程名、优先级、是否是守护线程等属性。
- 默认情况下,使用 Executors.defaultThreadFactory() 创建的线程工厂。
- 拒绝策略 (RejectedExecutionHandler):
- 当线程池无法处理新任务时(例如,因为线程池已关闭或已达到 maximumPoolSize,且工作队列已满),将使用此策略处理任务。
- Java 提供了几种内置的策略,如 AbortPolicy, CallerRunsPolicy, DiscardOldestPolicy, DiscardPolicy,也可以自定义。
下面是一个简单的 ThreadPoolExecutor 构造函数的例子:
ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, // corePoolSize
10, // maximumPoolSize
60L, // keepAliveTime
TimeUnit.SECONDS, // TimeUnit
new LinkedBlockingQueue<>(), // workQueue
Executors.defaultThreadFactory(), // threadFactory
new ThreadPoolExecutor.AbortPolicy() // handler
);
在这个例子中,线程池的核心线程数是 5,最大线程数是 10,空闲线程的存活时间是 60 秒,使用 LinkedBlockingQueue 作为工作队列,使用默认的线程工厂,以及 AbortPolicy 作为拒绝策略。你可以根据需要调整这些参数。