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

有如下的程序:

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)代码块里判断中断状态,因为它始终为假。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值