关于Java thread的interrupt, isInterrupt, interrupted

在《Java网络编程》上看到一个例子, 说是用thread.interrupt()去关闭在等待的线程。不太明白,于是去查了一下Java的API。 

有兴趣的同行们可以先看看API的内容,再看以下总结:

 

1. thread.isInterrupt()和Thread.interrupted()都返回当前线程interrupt的状态

  • thread.isInterrupt()是非静态函数,作用目标是“线程实例”,一般用法如下,
Java代码 
  1. TestInterrupt t = new TestInterrupt();  
  2. t.start();  
  3. System.out.println(t.isInterrupt());  

 

  • 而Thread.interrupted()是静态函数,作用目标是“当前线程”
Java代码 
  1. System.out.println(Thread.interrupted());  

 并且它会把当前线程的interrupt状态“复位”,假设当前线程的isInterrupt状态为true,它会返回true,但过后 isInterrupt的状态会复位为false。之后调用(Thread)t.isInterrupt或Thread.interrupted都会返回 false

 

 

2. interrupt()被调用后有几个可能,下面挑几种常见的归类一下:

 

线程阻塞的情况下:

Java代码 
  1. public void run() {  
  2.   
  3.     while (!Thread.currentThread().isInterrupted()) {  
  4.         try{  
  5.             Thread.sleep(1000);  
  6.         } catch (InterruptedException ie){  
  7.             ie.printStackTrace();  
  8.         }  
  9.     }  
  10. }  

 如上所示,如果线程运行到Thread.sleep(1000)时,被其他线调用了该线程的interrupt()的方法,它将会进入catch的段落里面,然后再运行while (!Thread.currentThread().isInterrupted()) 时退出run, 线程被销毁。

 

 

 

线程正常运行的情况下:

  •  该线程不受影响,继续运行,但该线程的isInterrupt状态将被设置成true
Java代码 
  1. public void run() {  
  2.   
  3.     while (!Thread.currentThread().isInterrupted()) {  
  4.         try{  
  5.             //A: 无阻塞的代码.......  
  6.             ......  
  7.             //B: 被调用interrupt.......  
  8.             ......  
  9.             //C: 无阻塞的代码.......  
  10.         } catch (InterruptedException ie){  
  11.             ie.printStackTrace();  
  12.         }  
  13.     }  
  14. }  

 如上所示, 当线程正常运行时,在运行到B点时被调用了interrupt(), 此时该线程将继续正常运行,但isInterrupt的状态会被设为true,当做完 A,B,C的代码时,再进入while (!Thread.currentThread().isInterrupted()) 时,该线程被销毁。假如while的检查条件改为(true),该线程不会受影响,将会一直运行下去

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值