java - java中线程的中断状态标志在哪里,为什么interrupted()方法是静态的

标签 java interrupt

第一个问题是:interrupt() 方法的中断状态标志在哪里 sets :

 public void interrupt() {
            if (this != Thread.currentThread())
                checkAccess();

            synchronized (blockerLock) {
                Interruptible b = blocker;
                if (b != null) {
                    interrupt0();           // Just to set the interrupt flag
                    b.interrupt(this);
                    return;
                }
            }
            interrupt0();
        }

第二个问题是: 为什么 interrupted() 方法是静态?和 isInterrupted 不是静态的?

最佳答案

语言规范没有规定中断状态应该如何实现。在hotspot中,您可以在JVM代码中找到实现细节。例如,对于 Linux,它是 here大约第 4140 行。

interrupted 是静态的,因为它检查当前线程状态。换句话说,如果您在主线程上调用 new Thread().interrupted(),如果主线程被中断,您将得到 true,而不是新线程被中断。

isInterrupted 检查调用该方法的线程是否被中断。在上面的示例中,它将返回 new Thread() 的状态,即 false。

最后,两种方法的一个重要区别是interrupted清除中断状态。重置它通常是一个好习惯,除非您的代码负责给定线程的生命周期:

if (Thread.interrupted()) {
  Thread.currentThread().interrupt();
  //etc.
}

关于java - java中线程的中断状态标志在哪里,为什么interrupted()方法是静态的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43495186/

相关文章:

c - 设置中断标志

java - Jackson 和 Guava 数据类型模块 : Ignore missing fields, 但序列化显式空值

java - 通用类未找到异常

Java => 机器人执行错误命令

multiprocessing - 在多处理器系统中禁用中断的过程是什么?

java - 线程似乎没有干净地退出 - 线程挂起

java - 编辑单元格时切换值

java - 自动生成Java源码

python - 在Python程序中提供超时

linux-kernel - 从 FIQ 中断处理程序访问内核驱动程序数据失败