题目
简述Java线程池的创建及核心参数
信息
- 类型:问答
- 难度:⭐
考点
线程池创建,核心参数理解,线程池作用
快速回答
Java线程池通过ThreadPoolExecutor创建,核心参数包括:
- corePoolSize:核心线程数
- maximumPoolSize:最大线程数
- keepAliveTime:非核心线程空闲存活时间
- workQueue:任务队列
- threadFactory:线程工厂
- handler:拒绝策略
作用:复用线程资源,控制并发开销。
解析
1. 原理说明
线程池通过复用已创建的线程执行任务,避免频繁创建/销毁线程的开销。核心工作流程:
- 提交任务时,优先使用核心线程执行
- 核心线程满载后,任务进入工作队列
- 队列满时创建非核心线程(不超过maxPoolSize)
- 线程和队列均满时触发拒绝策略
2. 代码示例
import java.util.concurrent.*;
public class ThreadPoolExample {
public static void main(String[] args) {
// 创建线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2, // corePoolSize
5, // maximumPoolSize
30, // keepAliveTime(秒)
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(10), // 任务队列
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
);
// 提交任务
executor.execute(() -> System.out.println("任务执行中..."));
// 关闭线程池
executor.shutdown();
}
}3. 核心参数详解
| 参数 | 说明 | 典型值 |
|---|---|---|
| corePoolSize | 常驻核心线程数,即使空闲也不会销毁 | CPU密集型:N+1(N=CPU核心数) |
| maximumPoolSize | 线程池最大线程数 | IO密集型:2N+1 |
| keepAliveTime | 非核心线程空闲存活时间 | 30-60秒 |
| workQueue | 任务队列,常用实现:ArrayBlockingQueue(有界)、LinkedBlockingQueue(无界) | 根据业务需求设定 |
| handler | 拒绝策略,常用:AbortPolicy(抛异常)、CallerRunsPolicy(调用者线程执行) | 需根据场景选择 |
4. 最佳实践
- 使用
ThreadPoolExecutor而非Executors工厂方法,避免无界队列导致OOM - IO密集型任务:增大线程数(如maxPoolSize=50)
- CPU密集型任务:线程数≈CPU核心数
- 务必调用
shutdown()关闭线程池
5. 常见错误
- ❌ 使用
Executors.newFixedThreadPool()创建无界队列线程池(可能导致OOM) - ❌ 忽略拒绝策略,默认
AbortPolicy可能使任务丢失 - ❌ 混淆
corePoolSize和maxPoolSize导致线程创建逻辑错误
6. 扩展知识
- 预定义线程池:
Executors.newCachedThreadPool()(可扩容线程池)、newSingleThreadExecutor()(单线程池) - 线程池状态:RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED
- 监控:通过
getActiveCount()、getQueue().size()监控线程池状态