关于线程 interrupt

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于线程 interrupt相关的知识,希望对你有一定的参考价值。

参考技术A

Thread有四个interrupt相关的方法interrupt()、interrupted()、isInterrupted()、isInterrupted(boolean ClearInterrupted),他们分别的作用是什么?

sleep()、wait()、join()这些方法抛出的InterruptedException跟这几个方法又有什么关系?

我们查看interrupt()、interrupted()、isInterrupted()、isInterrupted(boolean ClearInterrupted)这四个方法的注释,会发现都提到了一个状态interrupt status,这个状态true/false即为线程状态的一个标识位, 注意,这只是线程的一种中断机制,不一定会中断正在运行的线程,只是告诉线程选择在合适的时机中断自己。 这句话怎么理解呢?

也就是说我们的线程正常运行,外界通过一些操作改变了线程的interrupt status,线程并不会中断,只是改变了线程的interrupt status。

例1

例1 执行结果如下,可见interrupt方法只是改变了interrupt status,并没有中断线程的执行

sleep()、wait()、join()这些方法抛出的InterruptedException就跟interrupt status有关,这几个方法会一直监听interrupt status,一旦监听到这个status为true,则会抛出InterruptedException,并且会把这个状态clear为false。

例2

执行结果如下:

通过例1,我们知道调用interrupt方法,会把interrupt status置为true,而这里sleep监听interrupt status为true后会抛出InterruptedException,并且又将interrupt status重新clear为false,例2验证了这点。

现在理解了interrupt status这点后,我们就可以反过来看一下interrupt()、interrupted()、isInterrupted()、isInterrupted(boolean ClearInterrupted)这四个方法。

interrupt方法就是调用native方法将interrupt status置为true

isInterrupted()方法是一个native方法,会返回当前线程是否被interrupted,并且会根据传参ClearInterrupted来判断是否重置interrupt status

isInterrupted() 方法调用的上面的isInterrupted(boolean ClearInterrupted),并且传参false,说明会返回interrupt status,但是不会重置interrupt status

interrupted()方法也是调用的isInterrupted(boolean ClearInterrupted)方法,并且传参true,同样会返回interrupt status,并且会将状态重置为false

总结:线程的这种中断机制,是把线程的中断交给线程自己去处理,线程内部通过interrupt status去合理的中断线程,比如去清理资源等,而不是暴力的直接终止线程的运行。

以上是关于关于线程 interrupt的主要内容,如果未能解决你的问题,请参考以下文章

java---interruptinterrupted和isInterrupted的区别

多线程笔记一篇

Java 中 interrupted 和 isInterrupted 方法的区别?

Java 中 interrupted 和 isInterrupted 方法的区别?

关于线程

关于Java的多线程