首页 > 解决方案 > 为什么中断方式和 isInterrupted 行为方式之间存在差异?

问题描述

我只是通过Javadoc 进行中断。我确实得到了 Thread 类的两种方法之间的区别:interrupted() 和 isInterrupted()。引用文档:

当线程通过调用静态方法 Thread.interrupted 检查中断时,中断状态被清除。一个线程用来查询另一个线程的中断状态的非静态 isInterrupted 方法不会改变中断状态标志。

我不明白为什么这种行为一直如此?是否有任何理由interrupted重置当前线程的状态而isInterrupted不是调用它的线程?

标签: javamultithreading

解决方案


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

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

清除标志很方便,因为执行检查的线程预计会对中断做出反应并以某种方式处理它。如果您想再次重置标志,这很简单:只需调用interrupt.


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

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

//...

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

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

从实现的角度来看,如果这个方法要自动清除标志,那么这个检查然后重置必须是原子的,以避免线程foo在标志被重置之前读取它。您必须以某种方式与线程本身共享此互斥锁。这将使该isInterrupted方法使用起来非常笨拙。


推荐阅读