首页 ThreadPoolExecutor 整体工作流程
文章
取消

ThreadPoolExecutor 整体工作流程

开始

  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. 执行线程退出回调方法,进行相关簿记
本文由作者按照 CC BY 4.0 进行授权

ThreadPoolExecutor 源码阅读笔记一(JDK 1.8)

Maven 打包源码