1. 线程池基础认知
第一次接触线程池是在处理一个批量文件上传需求时。当时我简单粗暴地为每个文件创建新线程,结果服务器直接OOM崩溃。这个惨痛教训让我明白:线程不是越多越好,资源管理才是王道。
线程池本质上是个"线程复用工厂",核心解决两个问题:
- 降低频繁创建/销毁线程的开销(创建线程需要调用操作系统API,成本约1ms/次)
- 防止无节制创建线程导致系统资源耗尽(每个线程默认占用1MB栈内存)
Java标准库提供的ThreadPoolExecutor有四个关键参数:
- corePoolSize:核心线程数(长期保留的工人)
- maximumPoolSize:最大线程数(临时工上限)
- keepAliveTime:临时工闲置存活时间
- workQueue:任务排队区(候客区)
重要认知:线程池不是越大越好。CPU密集型任务建议线程数=CPU核数+1,IO密集型可适当放大(通常2*CPU核数)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 线程池工作原理深度解析
2.1 任务调度流程
当提交新任务时,线程池按以下顺序处理:
- 当前线程数 < corePoolSize → 立即创建新线程执行
- 达到corePoolSize → 任务进入workQueue排队
- 队列满且线程数 < maximumPoolSize → 创建临时线程
- 队列满且达到max线程数 → 触发拒绝策略
java复制// 典型处理流程代码模拟
if (workerCount < corePoolSize) {
addWorker(task, true); // 创建核心线程
} else if (workQueue.offer(task)) {
// 成功入队
} else if (!addWorker(task, false)) {
reject(task); // 触发拒绝策略
}
2.2 阻塞队列选型对比
队列类型直接影响线程池行为:
| 队列类型 | 特性 | 适用场景 |
|---|---|---|
