• 关于Java thread的Interrupt, isInterrupt, interrupted【转】


    转自:http://jay-kid.javaeye.com/blog/557064

    在《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),该线程不会受影响,将会一直运行下去。

  • 相关阅读:
    FirewallD 详解
    EventBus源码解析
    详谈 Jquery Ajax 异步处理Json数据.
    jQuery Ajax异步处理Json数据详解
    7款jQuery图片轮播滑动插件
    分享15款为jQuery Mobile定制的插件
    在springmvc中解决FastJson循环引用的问题
    SpringMVC与fastjson整合并同时解决中文乱码问题
    SpringMVC处理ajax请求
    spring mvc 返回json的配置
  • 原文地址:https://www.cnblogs.com/bayonetxxx/p/1872908.html
Copyright © 2020-2023  润新知