java 多线程 中断线程interrupt 研究

来源:互联网 发布:手机字体增大软件 编辑:程序博客网 时间:2024/05/16 19:15

今天研究多线程中的 中断线程 的概念 在java多线程中 stop()方法已经被废弃,留下了其余三个方法原型:

 public void interrupt(); public boolean isInterrupted(); public static boolean interrupted();

字面是中断的意思 但是这并不是直接中断某线程 而是设定一个中断状态 我们取到这个状态 该怎么处理是我们自己决定

  1. public void interrupt();
    当这个线程被阻塞在wait,join,sleep等方法的时候,调用 interrupt(非静态方法)会引起这个线程的interrupt状态被清空(设为false),并且前者三个方法会抛出InterruptedException。除此之外(这个线程不处于wait,join,sleep方法),这个线程的interrupt状态会被设置(设为true)。

  2. public static boolean interrupted();
    调用interrupt(静态方法)会返回当前线程的interrupt状态(true 或false),并把当前线程的interrupt状态清空(设为false)。
    注意:这个是个静态方法,并且返回的是当前线程状态,并不一定是调用者的线程状态。

  3. public boolean isInterrupted();
    判断此线程是true还是false,不影响中断状态

  4. 再补充一个原理:wait,join,sleep方法执行后,会不断的轮询监听 interrupted
    标志位,发现其设置为true后,会停止阻塞并抛出 InterruptedException异常。

然后我们看一个例子:

/** *  * 根据上面三个方法的原理对下面的结果对号入座 *  * @author panqian * @date 2016年12月21日 下午7:05:28 */package Thread;public class InterruptRunnable_2 implements Runnable {    @Override    public void run() {        while (true) {            System.out.println("我在外面。。。。");            try {                Thread.currentThread().sleep(2000);            } catch (InterruptedException e) {                System.out.println("捕捉到InterruptedException");                //非静态方法interrupt碰到线程阻塞     sleep()抛异常   清空中断状态   中断状态设为false                if (Thread.currentThread().isInterrupted()) {                    System.out.println("我走了。。。。");                }                //非静态方法interrupt未碰到线程阻塞     中断状态设为true                Thread.currentThread().interrupt();                if (Thread.currentThread().isInterrupted()) {                    System.out.println("我还是走了。。。。");                }                //静态方法interrupt清空中断状态  中断状态设为false                Thread.interrupted();                if (Thread.currentThread().isInterrupted()) {                    System.out.println("我真的走了。。。。");                }            }        }    }}
package Thread.test;import Thread.InterruptRunnable_2;/** * 试验中断线程 *  * @author panqian * @date 2016年12月21日 下午7:05:28 */public class InterruptThread_2 {    public static void main(String[] args) {        InterruptRunnable_2 interruptRunnable_2 = new InterruptRunnable_2();        final Thread thread = new Thread(interruptRunnable_2);        thread.start();        thread.interrupt();    }}

执行结果

我在外面。。。。捕捉到InterruptedException我还是走了。。。。     (只执行了这个输出指令   原因看代码注释)我在外面。。。。我在外面。。。。我在外面。。。。无限循环  

最后感谢 网上的一些资料 在此只是做个总结

0 0
原创粉丝点击