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

19 浏览
0 Comments

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

我正在研究Java中的多线程。

想要了解为什么一个线程处于被阻塞状态时不能被中断?为什么只有当线程处于等待状态时才能被中断?基本上,为什么我们需要一个可以被中断的线程状态和一个不能被中断的线程状态?

这个问题可能很基础,但我正在努力理解事情而不仅仅是记住它们。

0
0 Comments

线程在BLOCKED状态下无法被中断的原因是因为在等待获取资源时,线程会调用Thread.currentThread().interrupted()来检查是否被中断。然而,interrupted()方法只会清除中断状态并返回中断状态值,而不会真正中断线程。因此,线程仍然会保持在BLOCKED状态,无法被中断。

解决这个问题的方法是使用Lock::lockInterruptibly()方法。这个方法可以在等待获取资源时响应中断,并且会立即中断线程并抛出InterruptedException异常。

总结起来,线程在BLOCKED状态下无法被中断是因为interrupted()方法只清除中断状态而不中断线程。要解决这个问题,可以使用Lock::lockInterruptibly()方法来响应中断并立即中断线程。

0
0 Comments

线程处于BLOCKED状态时无法被中断的原因是因为线程在等待获取锁时被阻塞住了,无法执行中断操作。解决这个问题的方法是使用一个标志变量来判断线程是否被中断,并在合适的时候手动中断线程。

下面是一个示例代码,演示了如何中断一个处于BLOCKED状态的线程:

public class BlockedThreadExample {
    private static boolean isInterrupted = false;
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            synchronized (BlockedThreadExample.class) {
                while (!isInterrupted) {
                    try {
                        BlockedThreadExample.class.wait();
                    } catch (InterruptedException e) {
                        // 线程被中断时会抛出InterruptedException异常
                        // 在这里可以处理中断的逻辑
                        System.out.println("Thread interrupted");
                        isInterrupted = true;
                    }
                }
            }
        });
        thread.start();
        Thread.sleep(2000); // 让线程处于BLOCKED状态一段时间
        // 中断线程
        thread.interrupt();
        thread.join();
    }
}

在上面的代码中,当线程处于BLOCKED状态时,我们使用一个标志变量`isInterrupted`来判断线程是否被中断。当线程被中断时,会抛出`InterruptedException`异常,我们在catch块中将`isInterrupted`设置为true,表示线程已经被中断。

通过这种方式,我们可以在线程处于BLOCKED状态时手动中断线程,实现中断的效果。

0
0 Comments

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

Java中的线程中断只是一个标志。你可以在BLOCKED状态的线程上调用interrupt()方法,并且下次代码检查该标志时会看到它。

实现这样一个功能的主要问题是,一个关键字(synchronized)如何抛出异常?InterruptedException是一个可检查的异常,必须在语言中的每个synchronized方法和块中声明throws InterruptedException是没有意义的!

中断是一种通信工具,通常用于让线程知道需要检查的系统状态。这个名称是遗留下来的,是从硬件中设置的标志中继承的,用于让微处理器知道需要检查的特定状态(例如在某些输入引脚上设置的新值)。不要对“中断”这个名称过于深思熟虑,并认为它是用来打断另一个线程中的程序流程的工具。它并不是。因此,即使那些抛出异常的方法将其声明为可检查的,其他线程仍然可以忽略它并继续等待。任意打断另一个线程的BLOCKED状态会打断程序流程,这不是它的目的。

如果你从直接使用synchronized升级到使用java.util.concurrent包,那么你可以从阻塞的锁获取中抛出InterruptedException。

以上是关于为什么BLOCKED状态的线程不会被中断的原因以及解决方法的内容。

0