ThreadPoolExecutor#runWorker方法解析

if ((runStateAtLeast(ctl.get(), STOP) ||
                     (Thread.interrupted() &&
                      runStateAtLeast(ctl.get(), STOP))) &&
                    !wt.isInterrupted())
                    wt.interrupt();

先看这里判断
1)如果线程池已经是STOP状态并且线程没有被中断,那么就要中断当前线程;
2)1)条件不成立,证明线程池状态是RUNNING或者SHUTDOWN状态,再判断一下当前线程中断信号,如果中断信号是true,可能是用户调用shutdownNow方法导致,也可能是其他原因导致,再需要判断一下线程池状态,如果是STOP状态,则要中断当前线程;

为什么线程池是STOP状态就要中断线程,这是shutdownNow方法的定义,如果还没来到if条件线程池已经是STOP状态,但是中断信号被复位,这里就要判断,如果是跳过了if条件线程池才是STOP状态,线程也会接收到中断信号,满足shutdownNow方法的定义;

结论:
线程池是STOP状态那就要保留中断信号,如果不是,就要复位中断信号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值