java - 为什么中断方式和 isInterrupted 行为之间存在差异?

标签 java multithreading

我正在浏览 Javadoc for interrupts .我确实了解 Thread 类的两种方法之间的区别:interrupted() 和 isInterrupted()。引用文档:

When a thread checks for an interrupt by invoking the static method Thread.interrupted, interrupt status is cleared. The non-static isInterrupted method, which is used by one thread to query the interrupt status of another, does not change the interrupt status flag.

我不明白的是,为什么一直保持这种行为? interrupted 会重置当前线程的状态,而 isInterrupted 不会重置调用它的线程的状态,这有什么原因吗?

最佳答案

Thread.interrupted 只适用于当前线程;这是一个静态方法。

new Thread(() -> {
    while (true) {
        if (Thread.interrupted()) {
            break;
        }
        System.out.println("Running");
    }
});

清除标志很方便,因为执行检查的线程应该对中断使用react并以某种方式处理它。如果您想再次重置标志,那很简单:只需调用 interrupt


isInterrupted 不是静态方法。它被设计成可能被其他线程调用。

Thread foo = new Thread(/*...*/);
foo.start();

//...

if (foo.isInterrupted()) 
{
   //do something
}

首先,其他线程在概念上不应该能够告诉 foo 它不再被中断。 foo 必须自己处理中断 - 其他线程不能代表 foo 处理。

从实现的角度来看,如果此方法要自动清除标志,则必须将此先检查后重置设置为原子操作,以避免线程 foo 在重置标志之前读取标志。您将不得不以某种方式与线程本身共享此互斥锁。这会使 isInterrupted 方法使用起来非常笨拙。

关于java - 为什么中断方式和 isInterrupted 行为之间存在差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50117219/

相关文章:

java - 优化频繁flush()

python-3.x - 如何使用线程使用多个用户帐户运行热图用户机器人

multithreading - CUDA多个线程写入共享变量

Java Swing - PaintComponent() 不绘制我的线程

java - Sockets 和 ServerSockets 服务器/客户端 GUI 聊天程序

java - Spring 使用 websocket handler bean 作为单例,尽管它的原型(prototype)范围

java - 抽象工厂作为一种策略?

java - 从一长串空格中删除单个空格字符

java - 方法中final变量声明的作用是什么?

java - PriorityBlockingQueue 按 boolean 比较排序