线程池shutdown()和shutdownNow()源码解析

一、区别介绍

shutdown()
当线程池调用该方法时,线程池的状态则立刻变成SHUTDOWN状态。此时,则不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionException异常。但是,此时线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。
shutdownNow()
执行该方法,线程池的状态立刻变成STOP状态,并试图停止所有正在执行的线程,不再处理还在池队列中等待的任务,当然,它会返回那些未执行的任务。ShutdownNow()并不代表线程池就一定立即就能退出,它可能必须要等待所有正在执行的任务都执行完成了才能退出。

二、源码解析

上面对shutDown()以及shutDownNow()作了一个简单的结论。如果想知道原因,则需看JDK源码进行分析。

2.1 shutdown源码

public void shutdown() {
   
        final ReentrantLock mainLock = this.mainLock;
        mainLock.lock();
        try {
   
            //确保有在一般情况下关闭线程的权限,被允许中断每个工作线程
            checkShutdownAccess();
           //设置状态为SHUTDOWN
            advanceRunState(SHUTDOWN);
            interruptIdleWorkers();
            onShutdown(); // hook for ScheduledThreadPoolExecutor
        } finally {
   
            mainLock.unlock();
        }
        tryTerminate();
    }
    
private void advanceRunState(int targetState) {
   
        for (;;) {
   
            //循环,当状态至少是SHUTDOWN,或者cas把状态变为SHUTDOWN成功才退出
            int c = ctl.get();
            if (runStateAtLeast(c, targetState) ||
                ctl.compareAndSet(c, ctlOf(targetState, workerCountOf(c))))
                break;
        }
    }

重点看interruptIdleWorkers()方法:

private void interruptIdleWorkers() {
   
        interruptIdleWorkers(false);
    }
    
private void interruptIdleWorkers(boolean onlyOne) {
   
        final ReentrantLock mainLock = this.mainLock;
        mainLock.lock();
        try {
   
            for (Worker w : workers) 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值