为什么处于BLOCKED状态的线程不会被中断?

时间:2013-06-17 05:39:36

标签: java multithreading wait interrupt blocked

我很晚才开始在java中进行多线程处理。 想要了解Thread是否处于BLOCKED状态,为什么它不能被中断?为什么线程只有在处于WAIT状态时才能被中断?基本上,为什么我们需要两个Thread状态,一个可以被中断而另一个不能被中断?

这个问题可能非常基本但是,我试图理解事物而不仅仅是记住它们。

3 个答案:

答案 0 :(得分:4)

假设您的意思是让线程停止当前操作并抛出InterruptedException? Java中的线程中断只是一个标志。您可以在BLOCKED线程上调用interrupt(),并且下次代码检查时会看到该标志。

实现这样一个功能的主要问题是,关键字(synchronized)应该如何抛出异常? InterruptedException是一个经过检查的异常,用throws InterruptedException语言声明每个同步方法(和块)都不是一个有用的练习!

中断是一种通信工具,它通常用于让线程知道它需要检查的系统状态。该名称是从硬件中设置的标志进行的遗留传输/向上传递,以使微处理器知道需要检查的特定状态(例如在某些输入引脚上设置的新值)。不要过多地读入名称“interrupt”,并认为它是一个打破另一个线程中程序流的工具。它不是。因此,即使抛出异常的方法也将其声明为已检查,另一个线程可以自由地忽略它并在需要时继续等待。能够任意破坏另一个线程的BLOCKED状态会破坏程序流程,这不是目的。

答案 1 :(得分:0)

阻止的线程可以接收中断。您可能必须检查Thread.currentThread().interrupted()以查看线程在等待获取任何资源时是否获得中断。

另见Lock::lockInterruptibly()

答案 2 :(得分:0)

被阻止的线程可能被中断。以下是在线程上调用中断的方式,具体取决于它的状态。来自javadocs

  

调用此线程的checkAccess方法,这可能会导致a   抛出SecurityException。

     

如果在调用wait()时阻塞了这个线程,请等待(long),   或者等待(long,int)Object类或join()的方法,   join(long),join(long,int),sleep(long)或sleep(long,int)方法   这个类,然后它的中断状态将被清除   收到InterruptedException。

     

如果此线程在可中断的I / O操作中被阻止   然后通道将关闭,线程的中断状态   将被设置,线程将收到ClosedByInterruptException。

     

如果此线程在Selector中被阻塞,那么线程的中断   状态将被设置,它将立即从选择中返回   操作,可能具有非零值,就像选择器一样   唤醒唤醒方法。

     

如果以前的条件都没有,则该线程的中断   状态将被设置。

     

中断非活动的线程无需任何效果。

     

抛出:SecurityException - 如果当前线程无法修改它   螺纹