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