java关于Thread.interrupted()的混淆

Ath*_*ena 0 java interrupt

我正在浏览关于线程的oracle java教程,我看到了这个例子

src:http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html

如果一个线程长时间没有调用抛出InterruptedException的方法怎么办?然后它必须定期调用Thread.interrupted,如果收到中断,则返回true.例如:

for (int i = 0; i < inputs.length; i++) {
      heavyCrunch(inputs[i]);
      if (Thread.interrupted()) {
           // We've been interrupted: no more crunching.
      return;
}
Run Code Online (Sandbox Code Playgroud)

该教程补充说: 中断机制是使用称为中断状态的内部标志实现的.调用Thread.interrupt设置此标志.当线程通过调用静态方法Thread.interrupted来检查中断时,将清除中断状态.非静态isInterrupted方法,由一个线程用于查询另一个线程的中断状态,不会更改中断状态标志.

按照惯例,任何通过抛出InterruptedException退出的方法都会在执行此操作时清除中断状态.但是,通过另一个调用中断的线程,总是可以立即再次设置中断状态.

现在我很困惑.它什么时候发生?如果有中断,那么线程是否应该收到InterruptedException?

有人可能会使用这些检查代码的方法吗?Thread.interrupt(标志)是静态的,所以通过上面的检查,我们实际检查是否有任何踏板被中断?即使是这种情况,根据教程,当线程通过调用静态方法Thread.interrupted来检查中断时,中断状态被清除. 或者通过抛出InterruptedException退出的任何方法都会在执行此操作时清除中断状态

那么,我错过了什么吗?或者这只是有用的,如果某个线程收到了一个中断,但没有检查它,或者没有抛出它?

Evg*_*eev 5

这是Thread.interrupted实现

public static boolean interrupted() {
    return currentThread().isInterrupted(true);
}

private native boolean isInterrupted(boolean ClearInterrupted);
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它只能检查/重置当前线程的中断状态.如果它不是静态的,你可以在其他线程上调用它并重置它们的状态,这是API不允许的.