多线程之线程池ThreadPoolExecutor 源码解析

整体

public class ThreadPoolExecutor extends AbstractExecutorService
public abstract class AbstractExecutorService implements ExecutorService
public interface ExecutorService extends Executor
public interface Executor 

属性

// 高三位 表示线程状态 除去高三位后的表示 线程数量
	private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
//  表示在 ctl 中低COUNT_BITS 是用于存放线程数量的位
	private static final int COUNT_BITS = Integer.SIZE - 3;
//COUNT_BITS 最大表示数位
	private static final int COUNT_MASK = (1 << COUNT_BITS) - 1;
// 线程状态 运行 111 000000000000000000 
	private static final int RUNNING    = -1 << COUNT_BITS;
// 000 000000000000000
	private static final int SHUTDOWN   =  0 << COUNT_BITS;
// 001 000000000000000
	private static final int STOP       =  1 << COUNT_BITS;
// 010 000000000000000
	private static final int TIDYING    =  2 << COUNT_BITS;
// 011 000000000000000
	private static final int TERMINATED =  3 << COUNT_BITS;
	// 阻塞队列 当线程池中达到核心线程数量时 就会提交到workQueue中
	private final BlockingQueue<Runnable> workQueue;
	// 全局锁
	private final ReentrantLock mainLock = new ReentrantLock();
	// 真正存放worker的地方
	private final HashSet<Worker> workers = new HashSet<>();
	// 当外部线程调用 awaitTermination() 时 外部线程会等待当前线程池状态为 Termination为止
    // 就是 让外部线程封装成waitNode 放入到Condition 队列中 waitNode.thread 就会park
    // 当线程池状态变为 Termination时 会唤醒这些线程 这些线程会进入阻塞队列, 然后去抢占minLock
    // 抢占到 就继续执行
	private final Condition termination = mainLock.newCondition();
	// 生命周期内 最大线程数目
	private int largestPoolSize;
	// 任务完成总数
	private long completedTaskCount;
	// 线程工厂
	private volatile ThreadFactory threadFactory;
	// 拒绝策略
	private volatile RejectedExecutionHandler handler;
	//空闲线程存活时间
	private volatile long keepAliveTime;
	// 控制核心线程数量内的线程 是否可用被回收 true 可用
	private volatile boolean allowCoreThreadTimeOut;
	// 核心线程数量限制
	private volatile int corePoolSize;
	// 最大线程数
	private volatile int maximumPoolSize;

内部类 Worker

private final class Worker
        extends AbstractQueuedSynchronizer
        implements Runnable
    {
        private static final long serialVersionUID = 6138294804551838833L;

        // 工作线程
        final Thread thread;
        // 最先的开始执行的任务 如果不为null的话
        Runnable firstTask;
        // 完成了多少个任务
        volatile long completedTasks;

     	
        Worker(Runnable firstTask) {
        	// AQS 启动独占模式 为初始中状态 这个不能被抢占锁
            setState(-1); // inhibit interrupts until runWorker
            this.firstTask = firstTask;
             // 使用线程工厂创建一个线程,并且将当前worker 指定为runnable 会从run为入口
            this.thread = getThreadFactory().newThread(this);
        }

        /** Delegates main run loop to outer runWorker. */
        public void run() {
        // threadPoolExecutor ->runWorker() 这个核心方法
            runWorker(this);
        }

        // 判断当前 worker的独占锁是否被独占
        // 0 表示未被占用
        // 1 表示已被占用
        protected boolean isHeldExclusively() {
            return getState() != 0;
        }
        // 尝试去占用worker 的独占锁
        // 表示是否抢占成功
        protected boolean tryAcquire(int unused) {
        	// 使用cas 修改aqs中的state 期望值为0 表示未占用
            // true 表示抢占成功,设置ExclusiveOwnerThread 为当前线程
            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); }
        // 尝试加锁 如果锁是未持有状态 加锁成功就返回true 否者就不会阻塞 返回false
        public boolean tryLock()  { return tryAcquire(1); }
        // 一般情况下 调用unlock 要保证当前线程持有锁
        // 特殊情况 当worker的state ==-1  调用初始化 state==1
        // 启动worker
        public void unlock()      { release(1); }
        // 返回worker的lock 是否被占用
        public boolean isLocked() { return isHeldExclusively(); }

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

execute 方法

    // command 可以是 runnable 实现类 也可以是 futureTask
public void execute(Runnable command) {
        if (command == null)
            throw new NullPointerException();
        int c = ctl.get(); // 获取最新的ctl值
        // 如果worker的数量小于核心线程数 
        if (workerCountOf(c) < corePoolSize) { 
			// 增加一个worker 提交command任务 并且用核心线程数量作为限制
            if (addWorker(command, true))
                return;
            // 走到这里 说明 增加worker 失败了 
            // 1. 存在并发现象,execute 方法是可能有多个线程同时调用的, 当workerCountOf< corePoolSize 成立
            // 可能其他线程也成立了,并且创立的worker 这时核心线程数量已经达到
            // 2 当前线程状态已经发生改变     // RNNING < SHUTDOWN < STOP < tidying < TERMINATED
            // 当前线程池的状态不是running状态时 addworker 一定会失败
            // shutDown 状态下 也有可能出创建成功
            c = ctl.get(); 
        }
        // 前置条件 工作线程已经达到核心线程数量
        // 判断是不是运行状态 然后尝试添加任务
        
        if (isRunning(c) && workQueue.offer(command)) {
        	// offer任务提交成功了
        	// 再次获取线程池状态
            int recheck = ctl.get();
            // 如果不是运行状态 && 移除command 任务
             // remove(command) 有可能成功 有可能失败
            // 成功 提交之后线程池的线程还未消费
            // 失败 提交之后 在shutdown() 之前就被线程池中的线程给处理了
            if (! isRunning(recheck) && remove(command))
            	  // 提交之后线程状态非running 切 任务出队成功 走拒绝策略
                reject(command);
            // 说明 是运行状态 
            // 说明 线程池是非running 但是remove提交的任务失败
            // 担保机制 保证一定有一个线程工作
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        //走到这里
        // 1. 不是运行状态
        // 2 offer失败
        //		2.1 说明 可能当前Queue 已经满了 当前线程数量还有达到最大线程数量 尝试创建新的线程来执行Task
        // 假设当前线程池 数量达到最大 这里也会失败 走拒绝策略
        // 线程池不是running状态 这个时候因为command!=null  addWorer一定是false
        else if (!addWorker(command, false))
            reject(command);
    }

addWorker

private boolean addWorker(Runnable firstTask, boolean core) {
		// 自旋
		// 判断当前线程池是否允许创建新的线程
        retry:
        for (int c = ctl.get();;) {
           // c 是最新的 Ctl值 
          // 判断当前线程状态 是不是>=SHUTDOWN  
            if (runStateAtLeast(c, SHUTDOWN)&& 
            	// 判firstTask 不是空 工作队列不为空
                 (runStateAtLeast(c, STOP)|| firstTask != null || workQueue.isEmpty())
                )
                //线程池状态 rs> shutdown
                // rs = shutdown 但是队列已经没有任务了
                return false;
			// 自旋
			// 获取令牌的过程
            for (;;) {
            	
                if (workerCountOf(c) // 线程数量 是不是大于 限制条件
                    >= ((core ? corePoolSize : maximumPoolSize) & COUNT_MASK))
                    // 如果大于 说明无法添加新线程了
                    return false;
                 // 通过cas的 让workerCount 增加1
                if (compareAndIncrementWorkerCount(c))
               // 线程计数已经成功了 已经申请了一个令牌了
                    break retry;
                c = ctl.get();  // 再次获取 ctl 的最新值
                // 判断当前线程池是否发生过变化,如果外部再次之前调用shutdown 就会失败
                if (runStateAtLeast(c, SHUTDOWN)) 
                // 状态发生变化后 直接返回到外部循环
                    continue retry;
              
            }
        }
		// 当前创建的worker 是否已经启动
        boolean workerStarted = false;
       // 当前创建的worker 是否已经添加到池子
        boolean workerAdded = false;
        // worker 的引用
        Worker w = null;
        try {
            // 创建worker 线程已经创建好了
            w = new Worker(firstTask);
            // 新创建的worker的线程
            final Thread t = w.thread;
            //为了防止ThreadFactory 实现类有bug
            if (t != null) {
                // 将全局锁的引用 给mainLock
                final ReentrantLock mainLock = this.mainLock;
                // 持有全局锁 会阻塞 直到获取成功 同一时刻操纵线程吃内部相关操作都必须持有锁

                mainLock.lock();
                try {
                    // 再次获取最新的线程池运行状态
                    int c = ctl.get();
                    // 判断是否是running  判断当前状态是否小于stop 并且 firstTASK等于null
                    if (isRunning(c) ||
                        (runStateLessThan(c, STOP) && firstTask == null)) {
                        // t.isAlive() 当线程start后 线程isAlive 会返回true
                        if (t.isAlive()) // precheck that t is startable
                            throw new IllegalThreadStateException();
                        // 将创建的worker 添加到线程池中
                        workers.add(w);
                        // 获取最新的线程数量
                        int s = workers.size();
                        // 说明线程数量是一个新高,更新largestPoolSize
                        if (s > largestPoolSize)
                            largestPoolSize = s;
                        // 更新线程增加状态 添加到线程池了
                        workerAdded = true;
                    }
                } finally {
                    //释放全局锁
                    mainLock.unlock();
                }
                // 条件成功 说明添加成功 就start
                // s失败 就是lock之前就发生失败了
                if (workerAdded) {
                    // 启动线程
                    t.start();
                    // 启动标记设置为true
                    workerStarted = true;
                }
            }
        } finally {
            // 说明添加失败 需要清理工作
            if (! workerStarted)
                // 清理工作 释放令牌
                addWorkerFailed(w);
        }
        // 返回新创建的线程是否启动
        return workerStarted;
    }

runWorker

 // w 就是启动的worker
    final void runWorker(Worker w) {
        // wt 就是w.thread
        Thread wt = Thread.currentThread();
        // 初始执行task 复制给task
        Runnable task = w.firstTask;
        w.firstTask = null; // 清空引用
        //  为了初始化worker state
        w.unlock(); // allow interrupts
        // 是否突然退出 ture 发生异常了 需要做处理
        boolean completedAbruptly = true;
        try {
            // firstTask 不是null 直接执行
            // 说明当前线程在queue中获取任务成功,getTask这个方法是一个会阻塞方法
            // 如果返回null 说明当前线程需要退出逻辑
            while (task != null || (task = getTask()) != null) {
                // 加锁 独占锁
                // 就是怕shutdown时 会判断worker状态 根据独占锁是否空闲 ,判断worker 是否工作
                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
                // (runStateAtLeast(ctl.get(), STOP) 判断当前状态是不是大于stop 状态
                // 条件1 :说明线程池是不是出于 stop 或者 tidying或者termintion 此时线程一定要给他一个中断信号
                //  成立 说明当前线程池的状态 是>=stop 且当前线程是未设置中断状态 此时尝试中断。

                // 条件2 :(Thread.interrupted() &&
                //    runStateAtLeast(ctl.get(), STOP)))
                // 获取当前中断状态,且设置中断为false === 大概率还是false
                // 尝试刷新当前线程的中断标记 false 有可能上一次执行task 时 ,
                // 业务代码里面将当前线程的中断标记位设置为true 且没有处理

                //
                if ((runStateAtLeast(ctl.get(), STOP) ||
                     (Thread.interrupted() &&
                      runStateAtLeast(ctl.get(), STOP))) &&
                    !wt.isInterrupted())
                    wt.interrupt();

                try {
                    // 钩子方法 留给子类实现
                    beforeExecute(wt, task);
                    try {
                        // task 可能是futreTask 也可能是普通的runnable接口实现类
                        // 如果是通过submit 提交 可以封装成futreTask
                        task.run();
                        // 钩子方法
                        afterExecute(task, null);
                    } catch (Throwable ex) {
                        afterExecute(task, ex);
                        throw ex;
                    }
                } finally {
                    // 将局部数量task 设置为null
                    task = null;
                    // 更新worker 完成任务数量
                    w.completedTasks++;
                    // worker 工作完 会释放独占锁
                    // 再次回到getTask() 获取任务
                    // task,run() 发生内部异常
                    w.unlock();
                }
            }

            // getTask() 方法返回null时,说明当前线程应该执行退出逻辑
            completedAbruptly = false;
        } finally {
            //正常退出 completedAbruptly = false
            // 异常退出 completedAbruptly= true
            processWorkerExit(w, completedAbruptly);
        }
    }

getTask()

private Runnable getTask() {
        // 当前任务线程获取任务是否超时 false true 超时
        boolean timedOut = false; // Did the last poll() time out?
        // 自旋
        for (;;) {
            // 获取最新的ctl  高三位 线程状态
            int c = ctl.get();

            // 判断当前状态是不是大于 shutdown
            //(runStateAtLeast(c, STOP) || workQueue.isEmpty())
            // 1 c 的状态是不是>=stop  最低也是stop状态了 一定返回null
            // 2     // RNNING < SHUTDOWN < STOP < tidying < TERMINATED
            // 说明当前条件是 shutdown状态 说明任务队列空了 就返回null
            if (runStateAtLeast(c, SHUTDOWN)
                && (runStateAtLeast(c, STOP) || workQueue.isEmpty())) {
                // 计数-1 ctl
                decrementWorkerCount();
                return null;
            }

            // 执行到这
            // 1. 线程池是running
            // 2 线程池是 shutdown 但是任务队列还有任务

            // 获取线程池的线程数量
            int wc = workerCountOf(c);

            // Are workers subject to culling?
            // timed == true 支持超时机制 使用queue.poll 当获取task超时的情况下 下一次自旋可能返回null
            // timed == false 表示不支持超时机制,当前线程会使用queue.task();

            // 情况1  allowCoreThreadTimeOut==true 所有线程都可以被回收
            // 情况2  allowCoreThreadTimeOut == false 核心线程池会维护一个核心线程数
            // wc > corePoolSize 线程池中线程数量是大于核心线程的 就会返回null

            boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;
            //(wc > maximumPoolSize || (timed && timedOut))
            // 成立 外部线程改变最大线程数量
            // 使用poll 获取任务的方式 超时了
            // (wc > 1 || workQueue.isEmpty()))
            // 说明当前线程池 还有其他线程 当前线程可以直接去回收
            // 只有最后一个线程了 任务队列也为空了 .
            if ((wc > maximumPoolSize || (timed && timedOut))
                && (wc > 1 || workQueue.isEmpty())) {
                // 使用cas 将 ctl -1
                // 成功返回null
                // 其他线程先一步退出了 线程池状态发生改变了
                if (compareAndDecrementWorkerCount(c))
                    return null;
                // 在此自旋时 timed 可能是false了
                continue;
            }

            try {
                // 获取任务
                Runnable r = timed ?
                    workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
                    workQueue.take();
                // 返回任务
                if (r != null)
                    return r;
                // 超时了
                timedOut = true;
            } catch (InterruptedException retry) {
                timedOut = false;
            }
        }
    }

tryTerminate

final void tryTerminate() {
        // 自旋
        for (;;) {
            int c = ctl.get();
            // 如果是running状态 线程很正常
            // runStateAtLeast(c, TIDYING)说明其他任务正在执行 设置tidying
            // (runStateLessThan(c, STOP) && ! workQueue.isEmpty())
            // 如果当前线程小于stop 只能是shutdown状态 并且任务队列不为空
            if (isRunning(c) ||
                runStateAtLeast(c, TIDYING) ||
                (runStateLessThan(c, STOP) && ! workQueue.isEmpty()))
                return;
            // 线程状态> = stop
            // 线程池状态 为shutdown 队列为空
            // 当前线程数 不等于0
            if (workerCountOf(c) != 0) { // Eligible to terminate
                // 中断一个空闲线程
                // 唤醒线程会在getTask() 返回null
                // 执行退出逻辑会在会再次调用tryTerminate唤醒下一个线程
                // 最终所有空闲线程都会在这里正常退出
                // 非空闲线程在执行玩task 后 也会执行tryTerminate方法
                interruptIdleWorkers(ONLY_ONE);
                return;
            }

            // 最后一个退出的线程  >=STOP == ShutDown queue ==NULL
            // 0表示最后一个线程了
            final ReentrantLock mainLock = this.mainLock;
            mainLock.lock();
            try {
                // 设置线程池状态为TiDying
                if (ctl.compareAndSet(c, ctlOf(TIDYING, 0))) {
                    try {
                        //钩子方法
                        terminated();
                    } finally {
                        //线程池状态设置为  TERMINATED
                        ctl.set(ctlOf(TERMINATED, 0));
                        // 唤醒调用awaitTermination()方法的线程
                        termination.signalAll();
                    }
                    return;
                }
            } finally {
                mainLock.unlock();
            }
            // else retry on failed CAS
        }
    }

interruptIdleWorkers

  // onlyOne == true 说明中断1 个线程 否则中断多个
    // worker 是控线的
    private void interruptIdleWorkers(boolean onlyOne) {
        final ReentrantLock mainLock = this.mainLock;
        mainLock.lock();
        try {
            for (Worker w : workers) {
                // 获取当前所有的thread
                Thread t = w.thread;
                // 条件成立 说明t线程 尚未中断过,
                // 说明worker出于空闲状态 可以给一个中断信号

                if (!t.isInterrupted() && w.tryLock()) {

                    try {
                        // 中断信号 处于阻塞状态的线程就会唤醒
                        t.interrupt();
                    } catch (SecurityException ignore) {
                    } finally {
                        w.unlock();
                    }
                }
                if (onlyOne)
                    break;
            }
        } finally {
            mainLock.unlock();
        }
    }

processWorkerExit

    private void processWorkerExit(Worker w, boolean completedAbruptly) {
        // completedAbruptly==true 这个w 是异常退出的
        if (completedAbruptly)
            // 通过cas -1
            decrementWorkerCount();
        // 获取全局锁
        final ReentrantLock mainLock = this.mainLock;
        //加锁
        mainLock.lock();
        try {
            // 当前线程完成task 的数量 汇总到线程池的completedTaskCount
            completedTaskCount += w.completedTasks;
            // 移除 worker
            workers.remove(w);
        } finally {
            mainLock.unlock();
        }

        tryTerminate();
        // 获取最新的ctl 值
        int c = ctl.get();
        // 当前状态是running
        if (runStateLessThan(c, STOP)) {
            // 正常退出
            if (!completedAbruptly) {
                // min 表示最低持有的线程数量  allowCoreThreadTimeOut == true 说明核心线程数的线程也可以被回收

                int min = allowCoreThreadTimeOut ? 0 : corePoolSize;
                // 假设min= 0 判断队列不是空 最起码要留一个线程
                if (min == 0 && ! workQueue.isEmpty())
                    min = 1;
                // 条件成立 说明 线程池还拥有足够多的线程
                // 考虑 workerCountOf(c) > min (0>=0)?
                // 当前线程池中的核心线程数 是可以被回收的,这种情况当前线程池中的线程数 会变成0
                // 下次提交任务 会创建线程.
                if (workerCountOf(c) >= min)
                    return; // replacement not needed
            }
            // 执行task 线程异常退出
            //  一定要创建一个新worker顶上去,
            // 当前任务不是空的, qu最起码要留一个线程 running|| shutdown
            // sc < 核心线程数 会维护有核心线程数个。
            addWorker(null, false);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值