我很晚才开始在java中进行多线程处理。 想要了解Thread是否处于BLOCKED状态,为什么它不能被中断?为什么线程只有在处于WAIT状态时才能被中断?基本上,为什么我们需要两个Thread状态,一个可以被中断而另一个不能被中断?
这个问题可能非常基本但是,我试图理解事物而不仅仅是记住它们。
答案 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 - 如果当前线程无法修改它 螺纹