在《Java网络编程》上看到一个例子, 说是用thread.interrupt()去关闭在等待的线程。不太明白,于是去查了一下Java的API。
有兴趣的同行们可以先看看API的内容,再看以下总结:
1. thread.isInterrupt()和Thread.interrupted()都返回当前线程interrupt的状态
-
thread.isInterrupt()是非静态函数,作用目标是“线程实例”,一般用法如下,
Java代码
- TestInterrupt t = new TestInterrupt();
- t.start();
- System.out.println(t.isInterrupt());
-
而Thread.interrupted()是静态函数,作用目标是“当前线程”
Java代码
- System.out.println(Thread.interrupted());
并且它会把当前线程的interrupt状态“复位”,假设当前线程的isInterrupt状态为true,它会返回true,但过后 isInterrupt的状态会复位为false。之后调用(Thread)t.isInterrupt或Thread.interrupted都会返回 false
2. interrupt()被调用后有几个可能,下面挑几种常见的归类一下:
线程阻塞的情况下:
- 如果线程在调用
Object
类的wait()
、wait(long)
或wait(long, int)
方法,或者该类的join()
、join(long)
、join(long, int)
、sleep(long)
或sleep(long, int)
方法过程中受阻,则其isInterrupt状态将被清除,设成false, 它还将收到一个InterruptedException.
Java代码
- public void run() {
- while (!Thread.currentThread().isInterrupted()) {
- try{
- Thread.sleep(1000);
- } catch (InterruptedException ie){
- ie.printStackTrace();
- }
- }
- }
如上所示,如果线程运行到Thread.sleep(1000)时,被其他线调用了该线程的interrupt()的方法,它将会进入catch的段落里面,然后再运行while (!Thread.currentThread().isInterrupted()) 时退出run, 线程被销毁。
- 如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的isInterrupt状态将被设置成true, 并且该线程将收到一个
ClosedByInterruptException
。
线程正常运行的情况下:
- 该线程不受影响,继续运行,但该线程的isInterrupt状态将被设置成true
Java代码
- public void run() {
- while (!Thread.currentThread().isInterrupted()) {
- try{
- //A: 无阻塞的代码.......
- ......
- //B: 被调用interrupt.......
- ......
- //C: 无阻塞的代码.......
- } catch (InterruptedException ie){
- ie.printStackTrace();
- }
- }
- }
如上所示, 当线程正常运行时,在运行到B点时被调用了interrupt(), 此时该线程将继续正常运行,但isInterrupt的状态会被设为true,当做完 A,B,C的代码时,再进入while (!Thread.currentThread().isInterrupted()) 时,该线程被销毁。假如while的检查条件改为(true),该线程不会受影响,将会一直运行下去
相关推荐
java线程中的interrupt,isInterrupt,interrupted方法
中断在java中主要有3个方法,interrupt(),isInterrupted()和interrupted()。 interrupt(),在一个线程中调用另一个线程的interrupt()方法,即会向那个线程发出信号——线程中断状态已被设置。至于那个线程何去何从...
线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。线程会不时地检测这个中断标示位,以...
Thread.interrupt()方法的使用以及使用它退出线程
主要介绍了Java interrupt()方法使用注意_动力节点Java学院整理,需要的朋友可以参考下
一般来说,支持线程中断的方法(也就是线程中断后会抛出InterruptedException的方法),阻塞函数,如:Thread.sleep、Thread.jo
主要介绍了Java线程Thread之interrupt中断解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
NULL 博文链接:https://atell.iteye.com/blog/814444
主要介绍了Java如何使用interrupt()终止线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
java线程中断之interrupt和stop.docx
一个线程join另一个线程,(包括和interrupt互动的用法)1---马克-to-win java视频
interrupt code
Interrupt Example in MPLABX XC8 Compiler
com interrupt void interrupt 4 using 3
MCS51 中断interrupt
一个线程join另一个线程,(包括和interrupt互动的用法)3---马克-to-win java视频
interrupt,讲述飞思卡尔HCS12系列芯片的中断处理控制。
interrupt,interrupted,isInterrupted方法区别 join方法 yield方法 多线程 进程和线程 进程与线程最主要的区别是它们是操作系统管理资源的不同方式的体现。 准确来说进程与线程属于衍生关系。 进程是操作系统执行...
The Generic Interrupt Controller (GIC) architecture defines: • the architectural requirements for handling all interrupt sources for any processor connected to a GIC • a common interrupt controller ...
ARM Generic Interrupt Spec, refenrence manual for arm operating sytem development