线程池execute方法的源码解析

本文是线程池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);//将任务对象添加到任务队列中失败,则
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值