线程池详解
线程池详解
概述
线程池是管理一组工作线程的机制,避免频繁创建销毁线程的开销。
核心参数
ThreadPoolExecutor七大参数
- corePoolSize:核心线程数
- maximumPoolSize:最大线程数
- keepAliveTime:非核心线程空闲超时时间
- unit:时间单位
- workQueue:任务队列
- threadFactory:线程工厂
- handler:拒绝策略
工作流程
提交任务 → 核心线程数未满?→ 创建核心线程 → 队列未满? → 加入队列 → 线程数未满? → 创建非核心线程 → 执行拒绝策略
拒绝策略
- AbortPolicy:抛出异常(默认)
- CallerRunsPolicy:调用线程执行任务
- DiscardPolicy:直接丢弃
- DiscardOldestPolicy:丢弃最老任务,加入新任务
线程池大小选择
- CPU密集型:线程数 = CPU核心数 + 1
- IO密集型:线程数 = CPU核心数 × (1 + IO等待比)
常见问题
Q: 为什么先填满队列再创建非核心线程?
A: 减少线程数,降低线程切换开销和内存占用
Q: keepAliveTime的作用?
A: 非核心线程空闲超过该时间会被销毁
Q: 如何合理设置线程池大小?
A: 根据CPU密集和IO密集类型选择合适的线程数
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 kaii的博客!
