Java 线程池核心原理与实战配置
一、线程池的核心构成
线程池的本质其实很简单,就是任务队列 + 工作线程。它通过复用线程来减少创建和销毁的开销,同时控制并发量。
| 组件 | 作用 |
|---|---|
| 任务队列 | 缓存待执行的任务 |
| 工作线程 | 从队列中取出任务并执行 |
| 线程管理 | 动态控制线程数量,回收空闲线程 |
二、任务提交流程
当任务提交到线程池时,它会按照以下逻辑处理:
- 核心线程检查:如果当前线程数小于
corePoolSize,直接创建新线程执行任务。 - 队列填充:如果核心线程已满,任务会进入等待队列(
workQueue)。 - 最大线程扩展:如果队列也满了,且当前线程数小于
maximumPoolSize,则创建临时线程处理。 - 拒绝策略:如果队列满且线程数已达上限,触发拒绝策略(如抛异常或丢弃)。
注意:这里的顺序很重要。很多 OOM 问题就是因为队列无界,导致任务堆积而非创建更多线程。
三、七大关键参数
手动创建 ThreadPoolExecutor 时,这七个参数决定了线程池的行为:
new ThreadPoolExecutor(
int corePoolSize, // 1. 核心线程数
int maximumPoolSize, // 2. 最大线程数
long keepAliveTime, // 3. 空闲线程存活时间
TimeUnit unit, // 4. 时间单位
BlockingQueue<Runnable> workQueue, // 5. 任务队列
ThreadFactory threadFactory, // 6. 线程工厂
RejectedExecutionHandler handler // 7. 拒绝策略
);
| 参数 | 说明 | 常见示例 |
|---|---|---|
| corePoolSize | 常驻线程数 | 10 |
| maximumPoolSize | 弹性扩展上限 | 50 |
| keepAliveTime | 非核心线程空闲存活时间 | 60 秒 |
| workQueue | 阻塞队列类型 | ArrayBlockingQueue(100) |
| handler |


