ThreadPoolExecutor
是 Java 中强大的线程池实现,具有多种配置参数,可以灵活地根据具体应用需求进行调整。以下是 ThreadPoolExecutor
的核心配置参数及其简要说明:
1. corePoolSize
- 描述:核心线程池的大小,即最小保持存活的线程数量。即使这些线程在空闲状态,它们也不会被回收,除非设置了允许核心线程超时。
- 作用:确保总有
corePoolSize
个线程可以处理任务。
2. maximumPoolSize
- 描述:最大线程池的大小,即线程池中允许的最大线程数量。
- 作用:限制线程池可以创建的最大线程数量,以防止在高负载下系统资源耗尽。
3. keepAliveTime
- 描述:线程保持空闲的时间,即当线程池中的线程数量超过
corePoolSize
时,多余的线程在等待新任务到来时的最长时间。如果等待时间超过此值,多余的线程将被终止。 - 作用:允许动态调整线程池中的线程数量,释放资源。
4. unit
- 描述:
keepAliveTime
参数的时间单位。一般是TimeUnit
枚举类型中的一种,如TimeUnit.SECONDS
、TimeUnit.MILLISECONDS
等。 - 作用:指定
keepAliveTime
的时间单位。
5. workQueue
- 描述:任务队列,用于保存待执行的任务。可以是各种类型的阻塞队列,如
ArrayBlockingQueue
、LinkedBlockingQueue
、SynchronousQueue
等。 - 作用:管理和存储待执行的任务。
6. threadFactory
- 描述:线程工厂,用于创建新线程。默认使用
Executors.defaultThreadFactory()
,可以自定义实现以设置其他参数,如线程名称、优先级等。 - 作用:提供创建新线程的逻辑,允许自定义线程属性。
7. handler
- 描述:拒绝策略,当任务无法提交到线程池(例如,线程池已满或已关闭)时执行的处理方式。
- 作用:定义任务被拒绝时的处理行为。内置的拒绝策略包括:
AbortPolicy
(默认):抛出RejectedExecutionException
。CallerRunsPolicy
:由调用者线程处理该任务。DiscardPolicy
:抛弃当前任务。DiscardOldestPolicy
:抛弃队列中最老的任务,然后重新提交当前任务。
示例代码
以下是一个创建和配置 ThreadPoolExecutor
的简单示例:
import java.util.concurrent.*;
public class ThreadPoolExecutorExample {
public static void main(String[] args) {
// 核心参数配置
int corePoolSize = 2;
int maximumPoolSize = 4;
long keepAliveTime = 10;
TimeUnit unit = TimeUnit.SECONDS;
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(2);
ThreadFactory threadFactory = Executors.defaultThreadFactory();
RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
// 创建线程池
ExecutorService threadPool = new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
keepAliveTime,
unit,
workQueue,
threadFactory,
handler);
// 提交任务
for (int i = 0; i < 10; i++) {
final int taskNumber = i;
threadPool.submit(() -> {
try {
System.out.println("Task " + taskNumber + " is running by " + Thread.currentThread().getName());
Thread.sleep(2000);
System.out.println("Task " + taskNumber + " is completed by " + Thread.currentThread().getName());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
}
// 关闭线程池
threadPool.shutdown();
try {
if (!threadPool.awaitTermination(60, TimeUnit.SECONDS)) {
threadPool.shutdownNow();
}
} catch (InterruptedException ex) {
threadPool.shutdownNow();
Thread.currentThread().interrupt();
}
}
}
总结
ThreadPoolExecutor
提供了丰富的配置参数,可以用于精细地控制线程池的行为。这些参数能够帮助创建高效、稳定的线程池,适应各种不同的并发场景。理解并正确配置这些参数,有助于在实际应用中更好地利用线程池的优势,提高系统性能。