java 中断异常_为什么java里的线程可以在阻塞的时候捕获中断异常并处理?

概念

要弄清阻塞与中断的关系,首先得弄清楚什么叫做阻塞,什么叫做中断。

阻塞表示线程的一种状态,在这种状态下,线程是不占用CPU的(也就是说,不执行你写的命令代码的),更进一步来说,也就是你的代码在执行过程中,在某个地方暂停了。

而中断最初的含义是,指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。但在java中,中断的作用明显被弱化了,中断更多的是指线程标志位的某个状态,而中断的处理逻辑需要用户自己来进行定制(你可以选择处理中断,也可以选择不处理),责任交给了用户。

阻塞 & 中断 的关系

通过上面的逻辑的介绍,又引出了这样一个问题:

中断请求如果交给被中断的线程来进行处理,那么如果被中断的线程无法获取到CPU (比如永远处于阻塞队列中),那么中断将永远无法生效,这个问题如何解决?

很明显我们可以想到的一个办法,在一个线程A阻塞的情况下去中断该线程,我们不能让该线程去处理中断,因为它自己没有办法获取到|CPU,因此我们必须借助于其他线程来辅助完成A线程的中断过程。(简单的思路)

上面的思路只是想起到启发的作用,而真正在java中进行实现的时候,更加简单。当线程B去中断阻塞的线程A的时候,B将接受到异常InterruptException。java中直接将阻塞后中断设置为不相容的,(即不允许中断已经阻塞的线程)。这样子便避免了不确定的事情的发生(比如说,中断永远无效),与其让中断发出者不确定的等待,不如直接给他一个确定的反馈(中断的失败),因为在计算机中,程序的可终止性是一个必要的条件,既而程序不可终止更加难以容忍。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值