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

当Java的某个线程处于可中断的阻塞状态时,你用另一个线程调用该线程的interrupt()方法时,JVM会使该线程离开阻塞状态,并抛出一个异常。既然该线程已经离开阻塞状态,自然要参与到对CPU时间的争夺中,当获取到CPU时间时自然可以处理该异常。Java里一个线程调用了Thread.interrupt()到底意味着什么? - Intopass 的回答
■网友
概念要弄清阻塞与中断的关系,首先得弄清楚什么叫做阻塞,什么叫做中断。
阻塞表示线程的一种状态,在这种状态下,线程是不占用CPU的(也就是说,不执行你写的命令代码的),更进一步来说,也就是你的代码在执行过程中,在某个地方暂停了。
而中断最初的含义是,指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。但在java中,中断的作用明显被弱化了,中断更多的是指线程标志位的某个状态,而中断的处理逻辑需要用户自己来进行定制(你可以选择处理中断,也可以选择不处理),责任交给了用户。
阻塞 \u0026amp; 中断 的关系通过上面的逻辑的介绍,又引出了这样一个问题:
中断请求如果交给被中断的线程来进行处理,那么如果被中断的线程无法获取到CPU (比如永远处于阻塞队列中),那么中断将永远无法生效,这个问题如何解决?
很明显我们可以想到的一个办法,在一个线程A阻塞的情况下去中断该线程,我们不能让该线程去处理中断,因为它自己没有办法获取到|CPU,因此我们必须借助于其他线程来辅助完成A线程的中断过程。(简单的思路)
【为啥java里的线程可以在阻塞的时候捕获中断异常并处理】 上面的思路只是想起到启发的作用,而真正在java中进行实现的时候,更加简单。当线程B去中断阻塞的线程A的时候,B将接受到异常InterruptException。java中直接将阻塞后中断设置为不相容的,(即不允许中断已经阻塞的线程)。这样子便避免了不确定的事情的发生(比如说,中断永远无效),与其让中断发出者不确定的等待,不如直接给他一个确定的反馈(中断的失败),因为在计算机中,程序的可终止性是一个必要的条件,既而程序不可终止更加难以容忍。

■网友
CPU scheduling很简单,就是把该线程从wait/blocked queues移到ready queue了


    推荐阅读