并发(八):无法检查的中断状态

来源:互联网 发布:种族灭绝政策 知乎 编辑:程序博客网 时间:2024/05/19 14:38

有如下的程序:

public class LockedOwnThread extends Thread {    public void run () {        while(true) {            synchronized (this) {                try {                    Thread.sleep(10000);                } catch (InterruptedException e) {                    //  这里永远都输出false                    System.out.println("In Exception:" + this.isInterrupted());                    e.printStackTrace();                }            }        }    }    public static void main(String[] args) {        LockedOwnThread lt = new LockedOwnThread();        lt.start();        //  发出中断信号        lt.interrupt();        //  在这里能检查到中断状态        System.out.println(lt.isInterrupted());    }}

在上面的程序中,启动线程后立刻发出中断信号,紧接着在主线程中能迅速检查到中断状态,但是在Exception中永远都无法检查到中断状态,始终都为false。

在没有任何操作的前提下,中断状态却表现出两种截然不同的值,这是为什么呢?

原来当线程在非阻塞状态下中断时,系统为它设置中断状态,但是,只要触发了InterruptedException,那么中断状态将会被清除,所以在上面的代码中,在cath(InterruptedException e)代码块中,永远也检查不到中断状态为true。

结论

千万不要在cath(InterruptedException e)代码块里判断中断状态,因为它始终为假。

原创粉丝点击