0%

线程池

创建方式

ThreadPoolExecutor创建,了解线程创建参数避免资源耗尽。

核心参数

  • 核心线程数
  • 最大线程数
  • 线程空闲时间
  • 阻塞队列
    • ArrayBlockingQueue
    • LinkedBlockingQuewue
    • PriorityBlockingQueue
  • 拒绝策略
    • 丢弃任务并抛异常
    • 直接丢掉新任务
    • 丢掉队列中最早的任务
    • 提交任务的线程执行该任务

任务提交执行流程

  1. 提交任务
  2. 判断当前线程数是否小雨核心线程,如果小于则创建核心线程执行
  3. 否则判断阻塞队列是否已满,如果已满执行4,否则5
  4. 判断当前线程数是否达到最大线程数,如果达到则触发拒绝策略,否则创建新线程执行
  5. 加入阻塞队列即可

参数设计

  1. 根据任务类型设计:

    CPU密集型:与CPU核心数1~2倍。(不设置过多是CPU已经占用很高,避免无意义的上下文切换)

    IO密集型:采用《Java并发编程实战》的作者 Brain Goetz 推荐的计算方法:线程数 = CPU 核心数 *(1+平均等待时间/平均工作时间)

  2. 压测确定

    为了更准确的参数配置,可以通过压测来确定服务的最佳线程数量。