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()函数说明也能看出点眉目:

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页