本文是线程池execute方法的源码,在此之前可以先看下【线程池的创建】。
ThreadPoolExecutor中execute方法
newCachedThreadPool、newFixedThreadPool、newSingleThreadExecutor的execute方法在ThreadPoolExecutor中。
1)、顶层入口;
package java.util.concurrent;
public interface Executor {
void execute(Runnable command);
}
2)、ExecutorService,线程池真正的接口;
package java.util.concurrent;
public interface ExecutorService extends Executor {
//与本文讲解的execute关系不大,省略
}
3)、AbstractExecutorService ,ExecutorService的实现类,使用了abstract修饰,只实现了ExecutorService接口中部分接口;
package java.util.concurrent;
public abstract class AbstractExecutorService implements ExecutorService {
//与本文讲解的execute关系不大,省略
}
4)、ThreadPoolExecutor,继承了AbstractExecutorService类,包含execute方法;
package java.util.concurrent;
public class ThreadPoolExecutor extends AbstractExecutorService {
//ctl包含线程池的运行状态(高3位)和有效线程数信息(低29位)
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
//有效线程数所占位数(29)
private static final int COUNT_BITS = Integer.SIZE - 3;
//理论上有效线程数的最大值
private static final int CAPACITY = (1 << COUNT_BITS) - 1;
/**线程池运行状态*/
//线程池能够处理新任务,并且处理队列任务
private static final int RUNNING = -1 << COUNT_BITS;
//线程池不接受新任务,但是会处理队列任务
private static final int SHUTDOWN = 0 << COUNT_BITS;
//线程池不接受新任务,也不处理队列任务,会中断进行中的任务
private static final int STOP = 1 << COUNT_BITS;
//线程池中所有任务结束,有效线程数为0
private static final int TIDYING = 2 << COUNT_BITS;
//线程池完成状态
private static final int TERMINATED = 3 << COUNT_BITS;
//从ctl中解析出线程池运行状态的方法
private static int runStateOf(int c) { return c & ~CAPACITY; }
//从ctl中解析出有效线程数的方法
private static int workerCountOf(int c) { return c & CAPACITY; }
//ctl的初始化方法
private static int ctlOf(int rs, int wc) { return rs | wc; }
//其他省略
public void execute(Runnable command) {
if (command == null)//任务为空,抛出空指针异常
throw new NullPointerException();
int c = ctl.get();//获取线程池的运行状态和有效线程数
if (workerCountOf(c) < corePoolSize) {//有效线程数小于核心线程数
if (addWorker(command, true))//添加有效(核心)线程
return;
c = ctl.get();
}
if (isRunning(c) && workQueue.offer(command)) {//有效线程数不小于核心线程数,检查线程池是否是RUNNING状态;是,将任务对象添加到任务队列中
int recheck = ctl.get();//再次获取线程池的运行状态和有效线程数
if (! isRunning(recheck) && remove(command))
reject(command);//当前线程池不处于RUNNING状态,移除任务队列workQueue中的任务对象,并执行拒绝策略
else if (workerCountOf(recheck) == 0)
addWorker(null, false);//当前线程池中的worker数为0,则直接创建一个(非核心)线程,task为空的线程在执行时,会直接到任务队列中去获取任务
}
else if (!addWorker(command, false))
reject(command);//将任务对象添加到任务队列中失败,则