线程池的shutdown()与shutdownNow()方法的区别

老习惯先上结论:

shutdown只是将线程池的状态设置为SHUTWDOWN状态,正在执行的任务会继续执行下去,没有被执行的则中断。

而shutdownNow则是将线程池的状态设置为STOP,正在执行的任务则被停止,没被执行任务的则返回。

 

分析源码

  • 在源码层面上,shutdown调用的是advanceRunState(SHUTDOWN),而shutdownNow调用的是(STOP)
  • shutdown调用的事中断空闲的Workers,而shutdownNow调用的是中断所有的Workers
  • shutdownNow会把所有任务队列中的任务取出来,返回一个任务列表

 

advanceRunState区别

比较不容易理解的advanceRunState到底做了什么事情。

  • targetState参数的使用值只有两个:SHUTDOWN与STOP
    • SHUTDOWN值为0
    • STOP值为1<<29 = 2^29。 二进制表示的话1后面29个0

假设传的参数是SHUTDOWN:

  • ctlOf(targetState, workerCountOf(c)) = workerCountOf(c) > 0,一般就是线程池的个数

假设传的参数是STOP: 2^29

  • ctlOf(targetState, workerCountOf(c)) = 2^29 + 2 , 为STOP状态
  /**
  * 从运行的状态过渡到targetState
  * 如果当前已经大于了targetState,就什么都不做。
  */
    private void advanceRunState(int targetState) {
        for (;;) {
            int c = ctl.get();
            if (runStateAtLeast(c, targetState) ||
                ctl.compareAndSet(c, ctlOf(targetState, workerCountOf(c))))
                break;
        }
    }

如图:

targetState为STOP时

 

targetState为SHUTDOWN时

 

 

 

最后

把上面的结论再拿出来,shutdown与shutdownNow有什么区别呢?

  • shutdown调用的是advanceRunState(SHUTDOWN),而shutdownNow调用的是(STOP),即调用后设置的线程池状态不同
  • shutdown调用的是中断空闲的Workers,而shutdownNow调用的是中断所有的Workers
  • shutdownNow会把所有任务队列中的任务取出来,返回一个任务列表。而shutdown什么都不返回。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值