ThreadPoolExecutor源码解析

ThreadPoolExecutor源码解析及工作机制

首先介绍前提条件及本文用词说明

线程中断 interrupt()只是设置线程中断位,线程并没有被真正被中断,还是RUNNABLE状态

线程池中线程 == Worker线程(实际是Worker.thread)

线程池执行的任务 == task(也就是调用execute(Runnable r)传入的r)

线程池在调用shutDown()方法以后会拒绝接受新task,队列里的task会继续执行完,调用shutDownNow()方法后已经getTask()成功的task会运行完,然后剩下的task都将不会执行,task有wait,sleep,park的都会抛出InterruptedException,take()阻塞的线程也会唤醒,最后全部结束线程池为TERMINATED状态,返回未执行的任务集合。

private static final int COUNT_BITS = Integer.SIZE - 3;         // 后面低29位来源
// ctl贯穿全文标志,32位,高三位记录状态低29位记录WorkerCount数量,初始状态位RUNNING,Worker数量为0
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
private static final int CAPACITY   = (1 << COUNT_BITS) - 1;        // Worker线程数容量,2^29 - 1
5种状态,RUNNING < SHUTDOWN < STOP<TIDYING < TERMINATED
private static final int RUNNING    = -1 << COUNT_BITS;
private static final int SHUTDOWN   =  0 << COUNT_BITS;
private static final int STOP       =  1 << COUNT_BITS;
private static final int TIDYING    =  2 << COUNT_BITS;
private static final int TERMINATED =  3 << COUNT_BITS;
后面常用到的基础方法,runStateOf(int c)获取当前线程池状态,workerCountOf(int c)获取当前Worker数量
// 返回线程池状态,ctl高3位存储线程池状态
private static int runStateOf(int c)     { return c & ~CAPACITY; }  // ~CAPACITY:11100000000000000000000000000000
// 返回Worker数量,ctl低29位存储Worker数量
private static int workerCountOf(int c)  { return c & CAPACITY; }   //  CAPACITY:00011111111111111111111111111111
// 任何数与0 | 运算就等于本身不改变值,所以这里暂时没什么意义
private static int ctlOf(int rs, int wc) { return rs | wc; }
// 存放Worker
private final HashSet<Worker> workers = new HashSet<Worker>();
// 运行过程中最大的线程数
private int largestPoolSize;
// 完成的task总数
private long completedTaskCount;
// 默认的RejectedExecutionHandler,它的做法是超出队列而无法新增Worker就抛异常
private static final RejectedExecutionHandler defaultHandler =
    new AbortPolicy();
public static class AbortPolicy implements RejectedExecutionHandler {
        /**
         * Creates an {@code AbortPolicy}.
         */
        public AbortPolicy() { }

        /**
         * Always throws RejectedExecutionException.
         *
         * @param r the runnable task requested to be executed
         * @param e the executor attempting to execute this task
         * @throws RejectedExecutionException always
         */
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            throw new RejectedExecutionException("Task " + r.toString() +
                                                 " rejected from " +
                                                 e.toString());
        }
    }

 worker类  

private final class Worker
        extends AbstractQueuedSynchronizer
        implements Runnable
    {
        
        /** Thread this worker is running in.  Null if factory fails. */
        // 真正运行的线程
        final Thread thread;
        /** Initial task to run.  Possibly null. */
        // 真正执行的任务
        Runnable firstTask;
        /** Per-thread task counter */
        // 该Worker完成的总任务数
        volatile long completedTasks;

       
        Worker(Runnable firstTask) {
            // 防止被interrupts,interrupts时采用CAS将state从0改为1
            setState(-1); // inhibit interrupts until runWorker
            this.firstTask = firstTask;
            this.thread = getThreadFactory().newThread(this);
        }

        /** Delegates main run loop to outer runWorker  */
        public void run() {
            runWorker(this);
        }

        // Lock methods
        //
        // The value 0 represents the unlocked state.
        // The value 1 represents the locked state.

        protected boolean isHeldExclusively() {
            return getState() != 0;
        }

        protected boolean tryAcquire(int unused) {
            if (compareAndSetState(0, 1)) {
                setExclusiveOwnerThread(Thread.currentThread());
                return true;
            }
            return false;
        }

        protected boolean tryRelease(int unused) {
            setExclusiveOwnerThread(null);
            setState(0);
            return true;
        }

        // 采用独占锁,且不可重入
        public void lock()        { acquire(1); }
        public boolean tryLock()  { return tryAcquire(1); }
        public void unlock()      { release(1); }
        public boolean isLocked() { return isHeldExclusively(); }

        void interruptIfStarted() {
            Thread t;
            if (getState() >= 0 && (t = thread) != null && !t.isInterrupted()) {
                try {
                    t.interrupt();
                } catch (SecurityException ignore) {
                }
            }
        }
    }

 

1.构造方法

各个参数具体使用场景后面会写到

public ThreadPoolExecutor(int corePoolSize,                             // 核心线程数
                              int maximumPoolSize,                      // 最大线程数
                              long keepAliveTime,                       // 保持存活时间(这里不管设置什么默认用的纳秒,因为workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS))
                              TimeUnit unit,                            // 时间单位
                              BlockingQueue<Runnable> workQueue,        // 阻塞队列
                              ThreadFactory threadFactory,              // 线程构造工厂
                              RejectedExecutionHandler handler) {       // 拒绝策略
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }

2.execute()方法

public void execute(Runnable command) {
        if (command == null)
            throw new NullPointerException();
        /*
         * Proceed in 3 steps:
         *
         * 1. If fewer than corePoolSize threads are running, try to
         * start a new thread with the given command as its first
         * task.  The call to addWorker atomically checks runState and
         * workerCount, and so prevents false alarms that would add
         * threads when it shouldn't, by returning false.
         *
         * 2. If a task can be successfully queued, then we still need
         * to double-check whether we should have added a thread
         * (because existing ones died since last checking) or that
         * the pool shut down since entry into this method. So we
         * recheck state and if necessary roll back the enqueuing if
         * stopped, or start a new thread if there are none.
         *
         * 3. If we cannot queue task, then we try to add a new
         * thread.  If it fails, we know we are shut down or saturated
         * and so reject the task.
         */
        int c = ctl.get();
        if (workerCountOf(c) < corePoolSize) {
            // 新增一个Worker,新增成功则直接返回execute方法结束,这里core为true(worker数量上限为corePoolSize)
            if (addWorker(command, true))
                return;
            // 新增失败则再次获取ctl
            c = ctl.get();
        }

        // RUNING状态 且 offer成功(workQueue满了offer返回false)
        if (isRunning(c) && workQueue.offer(command)) {
            int recheck = ctl.get();
            if (! isRunning(recheck) && remove(command))
                reject(command);
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        // workQueue满了继续增加Worker,以maximumPoolSize为上限,若失败采取拒绝策略
        else if (!addWorker(command, false))
            reject(command);
    }

3.addWorker(boolean core)

// core为true时,Worker数量上限为corePoolSize
    // core为false时,Worker数量上限为maximumPoolSize
    private boolean addWorker(Runnable firstTask, boolean core) {
        // 循环直到采用CAS将ctl+1成功,或者满足下面【1】、【2】条件退出方法
        retry:
        for (;;) {
            int c = ctl.get();
            int rs = runStateOf(c);

            // Check if queue empty only if necessary.
            // 【1】非RUNING的时候,状态为SHUTDOWN且firstTask为空(执行task发生用户异常processWorkerExit()方法补偿的Worker线程),workQueue不为空才可以添加worker,否则返回false,添加失败
            if (rs >= SHUTDOWN &&
                ! (rs == SHUTDOWN &&
                   firstTask == null &&
                   ! workQueue.isEmpty()))
                return false;

            for (;;) {
                // 获取worker数量
                int wc = workerCountOf(c);
                // 【2】如果wc大于等于CAPACITY(2^30-1)或者大于等于指定的最大数量,返回false,添加失败
                if (wc >= CAPACITY ||
                    wc >= (core ? corePoolSize : maximumPoolSize))
                    return false;
                // 采用CAS将ctl+1,操作成功则退出循环retry
                if (compareAndIncrementWorkerCount(c))
                    break retry;
                // 上面加一操作失败,重新获取ctl值
                c = ctl.get();  // Re-read ctl
                if (runStateOf(c) != rs)
                    continue retry;
                // else CAS failed due to workerCount change; retry inner loop
            }
        }

        // worker是否已启动
        boolean workerStarted = false;
        // worker是否已添加到队列
        boolean workerAdded = false;
        Worker w = null;
        try {
            w = new Worker(firstTask);
            final Thread t = w.thread;
            if (t != null) {
                // 线程池ThreadPoolExecutor对象锁
                final ReentrantLock mainLock = this.mainLock;
                // 上锁目的:
                //          1)添加worker到workers(HashSet线程不安全)
                //          2)保证在添加worker到workers的过程中runState不会被其他线程改变(shutDown()方法),
                mainLock.lock();
                try {
                    // Recheck while holding lock.
                    // Back out on ThreadFactory failure or if
                    // shut down before lock acquired.
                    int rs = runStateOf(ctl.get());

                    // RUNNING状态 或者 SHUTDOWN状态且firstTask为空
                    if (rs < SHUTDOWN ||
                        (rs == SHUTDOWN && firstTask == null)) {
                        // 检查worker.thread是否已启动
                        if (t.isAlive()) // precheck that t is startable
                            throw new IllegalThreadStateException();
                        workers.add(w);
                        int s = workers.size();
                        if (s > largestPoolSize)
                            largestPoolSize = s;
                        workerAdded = true;
                    }
                } finally {
                    mainLock.unlock();
                }
                if (workerAdded) {
                    // 启动worker线程
                    t.start();
                    workerStarted = true;
                }
            }
        } finally {
            // worker Start失败则进行失败处理
            if (! workerStarted)
                addWorkerFailed(w);
        }
        return workerStarted;
    }

4.addWorkerFailed(Worker w)  Worker启动失败回滚处理方法

// Worker启动失败回滚处理方法
private void addWorkerFailed(Worker w) {
        final ReentrantLock mainLock = this.mainLock;
        // 上锁目的:
        // 1)从workers(HashSet线程不安全)移除worker,
        // 2)workers移除和ctl - 1,原子操作
        mainLock.lock();
        try {
            if (w != null)
                workers.remove(w);
            decrementWorkerCount();
            // 这里调用tryTerminate()的原因
            // A线程addWorker()的时候将Worker添加到workers,这时候另一个线程B调用了shutDown()方法,由于此时workers不为空,所以tryTerminate()不做任何操作
            // A线程接着start Worker线程,但是失败了所以无法进入runWorker()方法结束时调用的processWorkerExit()方法,也就无法调用tryTerminate()来terminate
            tryTerminate();
        } finally {
            mainLock.unlock();
        }
    }

5.runWorker(Worker w) 线程池中线程真正run()真正运行的逻辑

// 线程池中线程真正run()真正运行的逻辑
final void runWorker(Worker w) {
        Thread wt = Thread.currentThread();
        Runnable task = w.firstTask;
        w.firstTask = null;
        // 构造函数初始化的时候Worker.state == -1,不允许interrupts,现在改为0,允许被interrupts
        w.unlock(); // allow interrupts
        // if the worker died due to user exception
        // 当前Worker是否非正常结束(循环结束了会赋值为false)
        boolean completedAbruptly = true;
        try {
            // task==null说明是Worker运行task发生用户异常进入processWorkerExit方法,补进来的Worker线程
            while (task != null || (task = getTask()) != null) {
                w.lock();
                // If pool is stopping, ensure thread is interrupted;
                // if not, ensure thread is not interrupted.  This
                // requires a recheck in second case to deal with
                // shutdownNow race while clearing interrupt


                // 检查状态,如下情况都满足(状态大于SHUTDOWN)则中断Worker线程
                // 1)ctl >= STOP (STOP、TIDYING、TERMINATED) 或者 Worker线程被中断,立即重置线程状态(停止中断),停止中断后 ctl >= STOP
                // 2)Worker线程没被中断
                if ((runStateAtLeast(ctl.get(), STOP) ||
                     (Thread.interrupted() &&
                      runStateAtLeast(ctl.get(), STOP))) &&
                    !wt.isInterrupted())
                    wt.interrupt();
                try {
                    beforeExecute(wt, task);
                    Throwable thrown = null;
                    try {
                        // Worker线程真正执行firstTask业务逻辑
                        task.run();
                    } catch (RuntimeException x) {
                        thrown = x; throw x;
                    } catch (Error x) {
                        thrown = x; throw x;
                    } catch (Throwable x) {
                        thrown = x; throw new Error(x);
                    } finally {
                        afterExecute(task, thrown);
                    }
                } finally {
                    task = null;
                    w.completedTasks++;
                    w.unlock();
                }
            }
            // Worker线程正常结束
            completedAbruptly = false;
        } finally {
            // Worker线程结束处理 
            processWorkerExit(w, completedAbruptly);
        }
    }

6.getTask() Worker线程运行在循环体中开始位置调用getTask()获取任务

private Runnable getTask() {
        // 获取task是否超时标志,初始为false(还没取肯定为false)
        boolean timedOut = false; // Did the last poll() time out?

        for (;;) {
            int c = ctl.get();
            int rs = runStateOf(c);

            // Check if queue empty only if necessary.
            // 一下条件均满足则返回空
            // 1)状态 >= SHUTDOWN
            // 2)状态 >= STOP 或者workQueue为空
            // 上面条件 等价与
            //                  SHUTDOWN状态且workQueue为空(队列都为空了getTask()肯定返回空啦) 或者 > SHUTDOWN状态(以上状态肯定不能继续执行任务了,所以getTask()返回空)
            if (rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty())) {
                // WorkerCount数量 - 1(为什么要 - 1,因为getTask()方法返回空,调用这个方法的Worker线程就会退出循环结束线程了)
                decrementWorkerCount();
                return null;
            }

            // *** 能走到这里说明要么(1)、RUNING状态(2)、SHUTDOWN状态但是workQueue不为空,还有任务没有执行完 ***

            int wc = workerCountOf(c);

            // Are workers subject to culling?
            // 从workQueue获取任务是否有时间限制(allowCoreThreadTimeOut默认false)
            boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;

            // 以下条件均满足则执行WorkerCount - 1
            // 1)wc > maximumPoolSize 或者 timed && timedOut
            // 2)wc > 1 或者 workQueue为空
            // 这一步目的:
            //    减少多余的Worker线程(满足下面2个条件任意一个就是多余Worker线程),必须满足wc > 1 || workQueue.isEmpty()(因为Worker至少要留一个执行task,所以要 > 1(maximumPoolSize可能为0),或者workQueue为空了,这个时候==1也可以)
            //          1)大于maximumPoolSize
            //          2)timedOut == true(上次获取超时了) 且 allowCoreThreadTimeOut == true ,即使wc <= maximumPoolSize
            if ((wc > maximumPoolSize || (timed && timedOut))
                && (wc > 1 || workQueue.isEmpty())) {
                if (compareAndDecrementWorkerCount(c))
                    return null;
                continue;
            }

            try {
                // allowCoreThreadTimeOut == false 且 wc <= corePoolSize时才采用一直阻塞获取
                Runnable r = timed ?
                    workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
                    workQueue.take();
                if (r != null)
                    return r;
                // 走到这里说明肯定调用workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS),没取到值超时了返回空(因为take()会一直阻塞下去)
                timedOut = true;
            } catch (InterruptedException retry) {
                timedOut = false;
            }
        }
    }

7.processWorkerExit(Worker w, boolean completedAbruptly)

private void processWorkerExit(Worker w, boolean completedAbruptly) {
        // 正常结束WorkerCount不减一(正常结束因为getTask()方法返回空,在返回空之前会进行workerCount的减一。我们这里只用执行WorkerExit退出就行了,workerCount与本方法无关,异常的时候修改是为了保证workerCount与Worker数一直,因为后面会补一个Worker进来)
        // 用户异常减一(后面会补一个空firstTask的Worker进来),否则数量不一致
        if (completedAbruptly) // If abrupt, then workerCount wasn't adjusted
            decrementWorkerCount();

        final ReentrantLock mainLock = this.mainLock;
        mainLock.lock();
        try {
            completedTaskCount += w.completedTasks;
            workers.remove(w);
        } finally {
            mainLock.unlock();
        }

        // 尝试终止线程池
        tryTerminate();

        int c = ctl.get();
        // RUNNING 或者 SHUTDOWN状态,执行下面处理,否则直接返回
        if (runStateLessThan(c, STOP)) {
            // 如果不是用户异常导致进入processWorkerExit
            if (!completedAbruptly) {
                // 最小必须Worker线程数(allowCoreThreadTimeOut == true时,Worker线程可以减为0)
                int min = allowCoreThreadTimeOut ? 0 : corePoolSize;
                // 如果workQueue不为空,还有任务没完成,min至少为1
                if (min == 0 && ! workQueue.isEmpty())
                    min = 1;
                // 当前Worker线程数  >= min不做处理,直接返回;如果小执行后面的addWorker(null, false) 一般不会小于;
                if (workerCountOf(c) >= min)
                    return; // replacement not needed
            }
            // 添加一个空Worker线程,且此次添加Worker线程上线为maximumPoolSize
            addWorker(null, false);
        }
    }

8.tryTerminate()

final void tryTerminate() {
        for (;;) {
            int c = ctl.get();
            // 满足任意条件则返回,结束方法
            // 1)RUNNING状态
            // 2)大于等于TIDYING状态(TIDYING、TERMINATE)
            // 3)SHUTDOWN状态且workQueue不为空
            if (isRunning(c) ||
                runStateAtLeast(c, TIDYING) ||
                (runStateOf(c) == SHUTDOWN && ! workQueue.isEmpty()))
                return;

            // *下面的只有STOP状态 或者 SHUTDOWN状态且workQueue为空*

            // workerCount不为0,也就是idle Worker,可以terminate掉
            if (workerCountOf(c) != 0) { // Eligible to terminate
                // 中断所有Workers线程
                interruptIdleWorkers(ONLY_ONE);
                return;
            }

            final ReentrantLock mainLock = this.mainLock;

            // 上锁,防止其他线程修改ctl
            mainLock.lock();
            try {
                // 采用CAS将ctl设置成TIDYING状态,修改失败则重新进入循环
                if (ctl.compareAndSet(c, ctlOf(TIDYING, 0))) {
                    try {
                        terminated();
                    } finally {
                        // 将ctl设置成TERMINATED状态
                        ctl.set(ctlOf(TERMINATED, 0));
                        // 唤醒termination Condition
                        termination.signalAll();
                    }
                    return;
                }
            } finally {
                mainLock.unlock();
            }
            // else retry on failed CAS
        }
    }

9.shutdown()

public void shutdown() {
    final ReentrantLock mainLock = this.mainLock;
    mainLock.lock();
    try {
        checkShutdownAccess();
        // 将ctl高3位设置成SHUTDOWN对应的值,低29位设置成workerCount对应的值
        advanceRunState(SHUTDOWN);
        // 中断一个非中断且没锁的Worker线程
        interruptIdleWorkers();
        // ScheduledThreadPoolExecutor的钩子方法
        onShutdown(); // hook for ScheduledThreadPoolExecutor
    } finally {
        mainLock.unlock();
    }
    tryTerminate();
}

10.shutdownNow()

public List<Runnable> shutdownNow() {
    List<Runnable> tasks;
    final ReentrantLock mainLock = this.mainLock;
    mainLock.lock();
    try {
        checkShutdownAccess();
        // 将ctl高3位设置成STOP对应的值,低29位设置成workerCount对应的值
        // STOP状态,runWorker()方法循环执行真正task前都会检查状态,如果是STOP状态不会执行task,循环下次getTask()的时候,getTask()会返回空,结束Worker线程
        advanceRunState(STOP);
        // 中断所有Worker线程
        interruptWorkers();
        tasks = drainQueue();
    } finally {
        mainLock.unlock();
    }
    tryTerminate();
    return tasks;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值