3

Off late i am working on multithreading in java. Want to understand if a Thread is in BLOCKED state why it cant be interrupted? And why the thread can be interrupted only if it is in WAIT state? Basically, why do we need two Thread states one which can be interrupted and the other which cant be interrupted?

This question might be very basic but, I am trying to understand things rather than just remembering them.

4

3 回答 3

6

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

实现这种功能的主要问题是,关键字 ( synchronized) 应该如何引发异常? InterruptedException是一个已检查的异常,因此必须用throws InterruptedException!声明语言中的每个同步方法(和块)并不是一个有用的练习。

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

于 2013-06-17T05:57:22.447 回答
0

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

也可以看看Lock::lockInterruptibly()

于 2013-06-17T05:52:51.200 回答
0

被阻塞的线程可以被中断。这是根据线程所处的状态在线程上调用中断的方式。来自javadocs

调用该线程的 checkAccess 方法,可能会引发 SecurityException。

如果该线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法或 join()、join(long)、join(long, int) 时被阻塞, sleep(long), or sleep(long, int), 这个类的方法,那么它的中断状态会被清除并且会收到一个InterruptedException。

如果此线程在可中断通道上的 I/O 操作中被阻塞,则通道将关闭,线程的中断状态将被设置,并且线程将收到 ClosedByInterruptException。

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

如果前面的条件都不成立,则将设置该线程的中断状态。

中断一个不活动的线程不需要有任何效果。

抛出:SecurityException - 如果当前线程无法修改此线程

于 2013-06-17T05:53:12.490 回答