美文网首页
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