ThreadPoolExecutor的execute方法执行流程
前言
【Java线程池01】Java线程池简介
此文中对Java线程池简介,包含线程池相关的几个类的关系等。
【Java线程池02】ThreadPoolExecutor类概述
此文介绍了ThreadPoolExecutor的构造函数、核心字段以及核心方法
这篇文章将学习总结ThreadPoolExecutor的核心方法execute的执行流程
*源码
**
源码分析
从上述执行流程中我们可以得知,其核心点为addWorker方法,下篇文章将详细分析总结addWorker方法。
理解ThreadPoolExecutor中execute()方法原理
首先普及一下什么使ctl
ctl位操作变量
ThreadPoolExecutor有一个AtomicInteger变量,叫ctl(control的简写),一共32位,
高3位为线程池的状态runstatus(5中:Running,Shutdown,Stop,Tidying,Terminate),
低29位存当前有效线程数workerCount
分析execute()方法的原理
下面是execute的源码
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
int c = ctl.get();
//判断工作线程数小于核心线程数
if (workerCountOf(c) < corePoolSize) {
//执行addworker,创建一个核心线程,创建失败重新获取ctl
if (addWorker(command, true))
return;
c = ctl.get();
}
//如果工作线程数大于核心线程数,判断线程池的状态是否为running,并且可以添加进队列
//如果线程池不是running状态,则执行拒绝策略,(还是会调用一次addworker)
if (isRunning(c) && workQueue.offer(command)) {
//再次获取ctl,进行双重检索
int recheck = ctl.get();
//如果线程池是不是处于RUNNING的状态,那么就会将任务从队列中移除,
//如果移除失败,则会判断工作线程是否为0 ,如果过为0 就创建一个非核心线程
//如果移除成功,就执行拒绝策略,因为线程池已经不可用了;
if (! isRunning(recheck) && remove(command))
reject(command);
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}