java 多线程 中断线程interrupt 研究

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

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

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

  1. public void interrupt();
    中断这个线程,这个线程的中断状态设为true。当这个线程被阻塞在wait,join,sleep等方法的时候,调用 interrupt会让wait,join,sleep方法抛出InterruptedException,并且这个线程的interrupt状态被清空(设为false)。

  2. public static boolean interrupted();
    调用interrupt(静态方法)会返回当前线程的interrupt状态(true 或false),并把当前线程的interrupt状态清空(设为false)。所以你如果第二次调用interrupted方法,只会返回false。
    注意:这个是个静态方法,并且里面调用的是currentThread(),所以返回的状态是当前运行的线程,不是对象调用者的线程状态。

  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("线程因为在sleep时被中断抛出异常,捕捉到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
我还是走了。。。。     (只执行了这个输出指令   原因看代码注释)
我在外面。。。。
我在外面。。。。
我在外面。。。。

无限循环  

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值