线程池的七大参数?
Java 线程池(ThreadPoolExecutor
)的七大参数如下:
1. corePoolSize
:核心线程数,池中常驻线程。
2. maximumPoolSize
:最大线程数,池中允许的最大线程数。
3. keepAliveTime
:空闲线程存活时间,超出核心数的线程空闲多久被销毁。
4. unit
:存活时间单位(如秒、毫秒)。
5. workQueue
:任务队列,存储等待执行的任务。
6. threadFactory
:线程工厂,定制线程创建。
7. handler
:拒绝策略,队列满且线程满时的处理方式。
这些参数共同决定线程池的行为和性能。
1. 七大参数详解
(1) corePoolSize(核心线程数)
- 定义:
- 线程池保持的最小线程数,即使空闲也不销毁(除非设置
allowCoreThreadTimeOut
)。 - 作用:
- 处理常规任务。
- 示例:
corePoolSize = 5
,始终有 5 个线程待命。
(2) maximumPoolSize(最大线程数)
- 定义:
- 线程池允许的最大线程数,包含核心线程和临时线程。
- 作用:
- 应对任务高峰。
- 示例:
maximumPoolSize = 10
,最多 10 个线程。
(3) keepAliveTime(空闲线程存活时间)
- 定义:
- 非核心线程空闲超过该时间后被回收。
- 作用:
- 节省资源。
- 示例:
keepAliveTime = 60
,单位秒,空闲 60 秒销毁。
(4) unit(时间单位)
- 定义:
keepAliveTime
的单位。- 选项:
TimeUnit.SECONDS
、TimeUnit.MILLISECONDS
等。- 示例:
unit = TimeUnit.SECONDS
。
(5) workQueue(任务队列)
- 定义:
- 存放待执行任务的队列,核心线程满后任务入队。
- 常见类型:
ArrayBlockingQueue
:有界队列。LinkedBlockingQueue
:无界队列(默认)。SynchronousQueue
:直接提交。- 示例:
new LinkedBlockingQueue<>(100)
,容量 100。
(6) threadFactory(线程工厂)
- 定义:
- 创建线程的工厂,可定制线程名、优先级等。
- 作用:
- 便于调试和管理。
- 示例:
ThreadFactory factory = r -> new Thread(r, "my-thread-" + counter.incrementAndGet());
(7) handler(拒绝策略)
- 定义:
- 队列满且线程数达上限时的处理方式。
- 默认策略:
AbortPolicy
:抛RejectedExecutionException
。- 其他策略:
CallerRunsPolicy
:调用者线程执行。DiscardPolicy
:丢弃任务。DiscardOldestPolicy
:丢弃最老任务。- 示例:
new ThreadPoolExecutor.AbortPolicy()
。
构造器
ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, // corePoolSize
10, // maximumPoolSize
60, // keepAliveTime
TimeUnit.SECONDS, // unit
new LinkedBlockingQueue<>(100), // workQueue
Executors.defaultThreadFactory(), // threadFactory
new ThreadPoolExecutor.AbortPolicy() // handler
);
2. 执行流程
- 任务提交:
- 线程数 <
corePoolSize
:创建新线程。 - 核心满:
- 任务入
workQueue
。 - 队列满:
- 线程数 <
maximumPoolSize
:创建临时线程。 - 全满:
- 执行
handler
的拒绝策略。
图示
任务 -> corePoolSize 未满 -> 新建核心线程
-> 核心满 -> workQueue 未满 -> 入队
-> 队列满 -> maximumPoolSize 未满 -> 新建临时线程
-> 全满 -> 执行拒绝策略
3. 示例
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2, 5, 30, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardPolicy()
);
for (int i = 0; i < 10; i++) {
executor.execute(() -> {
System.out.println(Thread.currentThread().getName());
try { Thread.sleep(1000); } catch (Exception e) {}
});
}
executor.shutdown();
4. 延伸与面试角度
- 参数调优:
- CPU 密集:
corePoolSize = CPU 核心数 + 1
。 - IO 密集:
corePoolSize = 2 * CPU 核心数
。 - 队列:根据任务量选择有界/无界。
- 实际应用:
- Web 服务器:处理请求。
- 任务调度:批量处理。
- 与 Executors:
newFixedThreadPool
:固定核心,无临时。newCachedThreadPool
:无核心,动态临时。- 面试点:
- 问“参数”时,逐一解释。
- 问“流程”时,提执行顺序。
总结
线程池的七大参数控制线程数量、任务队列和异常处理,核心是 corePoolSize
和 maximumPoolSize
,配合队列和策略优化并发。面试时,可写构造器或提调优,展示理解深度。