自定义线程池
自定义线程池的七个参数:核心线程数,最大线程数,空闲时间,空闲时间单位,消息队列,线程工厂,拒绝策略阿里规范手册不允许使用jdk自带的创建线程池的工具,因为jdk工具创建的线程池消息队列和最大线程数都是无界的,会导致内存溢出。自定义线程池核心线程数的设定依据(关键要素):任务类型CPU密集型: [代码] IO密集型:…
作者:TaotaoYao
自定义线程池的七个参数:核心线程数,最大线程数,空闲时间,空闲时间单位,消息队列,线程工厂,拒绝策略
阿里规范手册不允许使用jdk自带的创建线程池的工具,因为jdk工具创建的线程池消息队列和最大线程数都是无界的,会导致内存溢出。
自定义线程池核心线程数的设定依据(关键要素):
- 任务类型
- CPU密集型:
核心数 = CPU逻辑核数 + 1 - IO密集型:核心数 = CPU逻辑核数 × 2 (常规场景) 核心数 = CPU核数 / (1 - 阻塞系数) (精确计算,阻塞系数=任务阻塞时间/总耗时)
- 业务需求
- QPS要求:根据每秒任务量及单个任务耗时估算
参考值 = QPS × 平均耗时(秒) × 冗余系数(1.2~1.5) - 流量特征:突发流量需结合队列容量设置缓冲
- 资源限制
- 服务器内存容量(每个线程占用约1MB栈内存)
- 容器化部署时应考虑CPU配额限制
- 队列策略
- 有界队列:核心线程数可适量降低
- 无界队列:需严格控制核心线程数(阿里规范禁用此方案)
- 最佳实践
- 初始值建议:
4核CPU - 生产环境通过压测确定准确数值
- 配合监控工具动态调整(如动态线程池)
注:需结合 最大线程数 和 队列容量 综合设计,避免初期过高设置导致资源浪费。建议在测试环境通过流量模拟逐步调优。
线程池的执行流程:当一个任务进入线程池时,先看是否有核心线程,如果没有就进入消息队列中进行等待,当消息队列满了之后会去查看最大线程数是否满了,如果满了则会执行拒绝策略,一般默认的拒绝策略是把当前任务交给主线程执行。