自定义线程池

自定义线程池的七个参数:核心线程数,最大线程数,空闲时间,空闲时间单位,消息队列,线程工厂,拒绝策略阿里规范手册不允许使用jdk自带的创建线程池的工具,因为jdk工具创建的线程池消息队列和最大线程数都是无界的,会导致内存溢出。自定义线程池核心线程数的设定依据(关键要素):任务类型CPU密集型: [代码] IO密集型:…

作者:TaotaoYao

自定义线程池的七个参数:核心线程数,最大线程数,空闲时间,空闲时间单位,消息队列,线程工厂,拒绝策略


阿里规范手册不允许使用jdk自带的创建线程池的工具,因为jdk工具创建的线程池消息队列和最大线程数都是无界的,会导致内存溢出。


自定义线程池核心线程数的设定依据(关键要素):

  1. 任务类型
  2. CPU密集型核心数 = CPU逻辑核数 + 1
  3. IO密集型:核心数 = CPU逻辑核数 × 2 (常规场景) 核心数 = CPU核数 / (1 - 阻塞系数) (精确计算,阻塞系数=任务阻塞时间/总耗时)
  4. 业务需求
  5. QPS要求:根据每秒任务量及单个任务耗时估算
    参考值 = QPS × 平均耗时(秒) × 冗余系数(1.2~1.5)
  6. 流量特征:突发流量需结合队列容量设置缓冲
  7. 资源限制
  8. 服务器内存容量(每个线程占用约1MB栈内存)
  9. 容器化部署时应考虑CPU配额限制
  10. 队列策略
  11. 有界队列:核心线程数可适量降低
  12. 无界队列:需严格控制核心线程数(阿里规范禁用此方案)
  13. 最佳实践
  14. 初始值建议:4核CPU
  15. 生产环境通过压测确定准确数值
  16. 配合监控工具动态调整(如动态线程池)
注:需结合 最大线程数 和 队列容量 综合设计,避免初期过高设置导致资源浪费。建议在测试环境通过流量模拟逐步调优。


线程池的执行流程:当一个任务进入线程池时,先看是否有核心线程,如果没有就进入消息队列中进行等待,当消息队列满了之后会去查看最大线程数是否满了,如果满了则会执行拒绝策略,一般默认的拒绝策略是把当前任务交给主线程执行。