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

时间:2018-05-01 13:18:03

标签: java multithreading

我刚刚经过Javadoc for interrupts。我确实得到了Thread类的两个方法之间的区别:interrupted()和isInterrupted()。引用文档:

  

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

我没有得到的是为什么这种行为确实如此? 有interrupted重置当前线程状态的原因是什么原因isInterrupted没有调用它的线程?

2 个答案:

答案 0 :(得分:3)

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执行此操作。

从实现的角度来看,如果此方法要自动清除该标志,则必须将此check-then-reset设置为原子,以避免线程foo在重置之前读取该标志。你必须以某种方式与线程本身共享这个互斥锁。这会使isInterrupted方法难以置信地使用。

答案 1 :(得分:0)

如果要检查线程是否已被中断,请致电thread.isInterrupted()

当你想检查当前线程是否被中断时,如果是,你将处理&吞下它,拨打Thread.interrupted()