线程池
flowchart TD
subgraph 线程池
core[核心线程]
queue[任务队列]
non_core[非核心线程]
reject[拒绝策略]
end
线程池原理
核心参数配置
ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, // 核心线程数
10, // 最大线程数
60, // 空闲线程存活时间(秒)
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(100), // 任务队列
Executors.defaultThreadFactory(), // 线程工厂
new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
);
拒绝策略对比
- AbortPolicy:直接抛出异常(默认)
- CallerRunsPolicy:由调用线程执行
- DiscardPolicy:直接丢弃任务
- DiscardOldestPolicy:丢弃队列最老任务
监控方法
// 获取线程池状态
int activeCount = executor.getActiveCount();
long completedCount = executor.getCompletedTaskCount();
int queueSize = executor.getQueue().size();
// 扩展ThreadPoolExecutor
class MonitorThreadPool extends ThreadPoolExecutor {
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
// 记录任务执行情况
}
}
调优建议
- CPU密集型:核心线程数=CPU核数+1
- IO密集型:核心线程数=CPU核数*2
- 混合型:拆分线程池分别处理
- 队列选择:
- 快速响应:SynchronousQueue
- 缓冲任务:LinkedBlockingQueue
- 监控指标: