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

标签 java multithreading wait interrupt blocked-threads

我正在研究 Java 中的多线程。 想了解如果线程处于 BLOCKED 状态,为什么它不能被中断?而为什么线程只有处于WAIT状态才能被中断?基本上,为什么我们需要两种线程状态,一种是可中断的,另一种是不可中断的?

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

最佳答案

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

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

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

关于java - 为什么处于 BLOCKED 状态的线程不会被中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17141003/

相关文章:

java - 解析CSV时出现Hadoop MapReduce错误

java - 如何在 Glassfish 3 上跟踪 SOAP 消息

C++代码编译但死掉问题(Having a line (queue), a buffer, and if not empty problem)

c# - 在不锁定 GUI 的情况下暂停方法的执行。 C#

java - 错误: JAVA_HOME is not defined correctly.我们无法执行/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home/bin/java

java - 是否可以有一个 jar Manifest 来使用文件夹中的所有 jar

c# - TextBox自定义ContextMenu in Style,多线程错误

multithreading - 使用静态和非静态方法从类中进行线程化

c - fork 多个进程并让父进程等待所有进程(在 C 中)

java - Selenium WebDriver get(url) 速度问题