Thread中interrupted()方法和isInterrupted()方法区别总结

 

 

interrupted()源码

 

 

isInterrupted()源码

 

 

interrupted()是静态方法:内部实现是调用的当前线程的isInterrupted(),并且会重置当前线程的中断状态

 

isInterrupted()是实例方法,是调用该方法的对象所表示的那个线程的isInterrupted(),不会重置当前线程的中断状态

 

 

测试方法验证:

1.    

第一个红框中断的线程是我们自己创建的myThread线程,我调用的interrupted(),由上面源码可知是判断当前线程的中断状态,当前线程是main线程,我根本没有中断过main线程,所以2次调用均返回“false”

 

 

 

2.

第一个红框中断的线程是当前线程(main线程),我调用的interrupted(),由上面源码可知是判断当前线程的中断状态,当前线程是main线程,所以第1次调用结果返回“true”,因为我确实中断了main线程,

 

由源码可知interrupted()调用的是isInterrupted(),并会重置中断状态,所以第一次调用之后把中断状态给重置了,从中断状态重置为非中断状态,所以第2次调用的结果返回“false”

 

 

3.

第一个红框中断的线程是我们自己创建的myThread线程,我调用的isInterrupted(),由上面源码可知是判断执行该方法的对象所表示线程的中断状态,也就是myThread引用所表示的线程的中断状态,所以第1次调用结果返回“true”,

 

由源码可知isInterrupted()不会重置中断状态,所以第一次调用之后没有把中断状态给重置(从中断状态重置为非中断状态),所以第2次调用的结果还返回“true”

 

 

 

 

 

 

4.

第一个红框中断的线程是我们自己创建的myThread线程,我调用的isInterrupted(),由上面源码可知是判断执行该方法的对象所表示线程的中断状态,也就是main的中断状态,我压根没有中断main线程,所以理所当然2次调用结果都返回“false”

 

 

5.

 

第一个红框中断的线程是当前线程(main线程),我调用的isInterrupted(),由上面源码可知是判断执行该方法的对象所表示线程的中断状态,也就是main的中断状态,所以第1次调用结果返回“true”,

 

因为源码内部调用isInterrupted() 参数传的false,不会重置main线程的中断状态,所以第2次调用还是返回”true”

 


以下内容根据9楼朋友提出的疑问做的调试:

一.自定义线程很快能执行完:

1-1.main线程中不调用 Thread.sleep(1000);

可能出现以下几种情况:

总结:当线程状态为TERMINATED时,会清除掉thread.interrupt()设置的中断状态

1-2.main线程中调用 Thread.sleep(1000);

只会出现下列情况:主线程在睡眠1秒,thread线程任务肯定执行完成了

 

二.自定义线程死循环,一直保持执行状态:

2-1.main线程中不调用 Thread.sleep(1000);

2-2.main线程中调用 Thread.sleep(1000);

 

第二种自定义线程死循环的场景比较简单,自定义线程都没执行完,所以线程状态都是RUNNABLE,thread.interrupt()设置的中断状态不会被清除。

所以总结出当线程状态为:TERMINATED时,会清除掉thread.interrupt()设置的中断状态!

我们看Thread源码的 interrupt()函数说明也能看出点眉目:

  • 78
    点赞
  • 188
    收藏
    觉得还不错? 一键收藏
  • 33
    评论
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值