ThreadPoolExecutor 整体工作流程

  1. 1. 开始
  2. 2. 创建线程
  3. 3. 执行线程

开始

  1. 初始化
  2. 调用 execute 方法
  3. 判断线程数是否小于核心线程数,如果是跳转到则创建核心线程(进入创建线程部分),firstTask 为要执行的任务,如果失败则跳转到4
  4. 判断线程池是否是 RUNNING 状态,如果是则放入任务队列如果成功则跳转到5 否则跳转到8
  5. 重新校验线程池是否是 RUNNING 状态,如果不是则跳转到6 否则 7
  6. 是否可以从队列中移除任务,如果是则跳转到9,否则跳转到 7
  7. 校验线程池线程数是否等于0,如果是创建非核心线程,firstTask 为空(进入创建线程部分)否则进入进行线程部分
  8. 创建非核心线程(进入创建线程部分),创建失败则跳转到9
  9. 拒绝任务

创建线程

  1. 校验线程池状态,如果满足如下任一情况,则创建线程失败,直接退出,否则跳转到 2
    • 线程池状态为 STOP、TINDYING、TERMINATED
    • SHUTDOWN 状态下 firstTask 不为空或者队列为空
  2. 判断线程池线程数量,如果满足如下任一情况则创建线程池失败,直接退出。否则跳转到 3
    • 线程池线程数大于等于线程池最大可承受线程数量(CAPACITY)
    • 如果是核心线程则线程数超过了核心线程数
    • 如果是非核心线程则线程数超过了线程池最大线程数(maximumPoolSize)
  3. 通过 CAS 的方式设置 ctl,如果成功则跳转到5 失败则跳转到 4
  4. 重新校验线程池状态,如果跟第1步中的状态不一致,则跳转到第 1 部,否则跳转到 2
  5. 再一次校验线程池状态,如果满足如下任一情况则线程池创建成功,跳转到6 否则跳转到 7
    • 线程池状态是 RUNNING
    • 线程池状态时 SHUTDOWN 且 firstTask 为空
    • 当前线程没有被启动
  6. 线程创建成功,进行相关簿记,并启动线程(进入到执行线程部分)
  7. 回调创建线程失败逻辑,进行相关簿记,然后退出。

执行线程

  1. 获取任务,firstTask 是否为空,不为空则跳转到到3,否则跳转到 2
  2. 从任务队列获取任务,如果不为空跳转到 3 ,否则跳转到 4
  3. 执行任务,如果没有抛出异常跳转到2,否则跳转到 4
  4. 执行线程退出回调方法,进行相关簿记