美文网首页
9、线程池之tryTerminate

9、线程池之tryTerminate

作者: kele2018 | 来源:发表于2020-03-17 15:23 被阅读0次

final void tryTerminate() {
        for (;;) {
            int c = ctl.get();
            //正在运行
            if (isRunning(c) ||
                //tidying  terminated
                runStateAtLeast(c, TIDYING) ||
                //shutdown 且 队列不为空
                (runStateOf(c) == SHUTDOWN && ! workQueue.isEmpty()))
                //综合上面3个条件,可以推断出当线程池stop或者shutdown且任务队列为空,就可以去terminated了
                return;
            //worker的数量不为零,说明还有任务在执行,所以先不要terminated线程池
            if (workerCountOf(c) != 0) { // Eligible to terminate
                //为什么这里要去中断一个线程?
                interruptIdleWorkers(ONLY_ONE);
                return;
            }

            final ReentrantLock mainLock = this.mainLock;
            mainLock.lock();
            try {
                //把ctl设置为TIDYING
                if (ctl.compareAndSet(c, ctlOf(TIDYING, 0))) {
                    try {
                        terminated();
                    } finally {
                        ctl.set(ctlOf(TERMINATED, 0));
                        termination.signalAll();
                    }
                    return;
                }
            } finally {
                mainLock.unlock();
            }
            // else retry on failed CAS
        }
    }

相关文章

网友评论

      本文标题:9、线程池之tryTerminate

      本文链接:https://www.haomeiwen.com/subject/vfptyhtx.html