如何关闭线程池

线程池提供了两个关闭方法,shutdownNow和shuwdown方法。

shutdownNow方法的解释是:线程池拒接收新提交的任务,同时立马关闭线程池,线程池里的任务不再执行,并尝试打断正在执行的任务,并且清空任务缓存队列,返回尚未执行的任务。

在ThreadPoolExecutor中是按照如下实现的:

执行checkShutdownAccess方法;

先判断当前JVM是否定义了安全管理器,如果有,进行校验,确保安全管理器能有权限中断所有的worker线程;

执行advanceRunState方法,

该方法会原子设置线程池的rs(runState)。设置的逻辑是,如果当前的线程池状态已经是要设置的状态,或者已经超过了要设置状态(runStateAtLeast方法返回值是true),就保持不做任何操作了,直接break。如果线程池当前状态比要设置的状态小,比如当前是RUNNING,要设置是的SHUTDOWN,那么runStateAtLeast方法返回false,继续走第二个判断,原子设置rs,如果失败的话继续这个流程。

执行interruptWorkers方法

该方法是直接将所有的工作线程中断;

执行drainQueue方法;

该方法是将任务队列中剩余的任务添加到taskList中,并返回;

执行tryTerminate方法:

首先判断线程池状态,如果是running状态或者tidying、terminated状态,再或者当前线程池处于shutdown状态,且workQueue不为空,直接退出当前方法;接下判断是否存在正在运行的worker,如果存在,中断唤醒1个正在等任务的空闲worker,接下来将线程池状态更新为tidying,执行子类的terminated()方法,并将线程池状态更新为terminated;

shutdown方法的解释是:线程池拒接收新提交的任务,同时等待线程池里的任务执行完毕后关闭线程池。该方法不会立即终止线程池,而是要等所有任务缓存队列中的任务都执行完后才终止,但再也不会接受新的任务

与shutDownNow的一个很大区别在于interruptIdleWorkers()方法,

过程中,有一个tryLock方法,一个获取锁的步骤,在线程还有任务执行的时候,tryLock获取锁失败,在线程执行完释放锁之后,tryLock就可以获取锁成功,从而达到,只有在线程执行完任务之后才关闭线程池的目的。

总结:只要调用了这两个关闭方法中的任意一个,isShutdown方法就会返回true。当所有的任务

都已关闭后,才表示线程池关闭成功,这时调用isTerminaed方法会返回true

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值