我正在阅读关于线程的 oracle java 教程,我看到了这个例子
源代码: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;
}
本教程补充说: 中断机制是使用称为中断状态的内部标志实现的。调用 Thread.interrupt 设置此标志。当线程通过调用静态方法 Thread.interrupted 检查中断时,中断状态被清除。一个线程用来查询另一个线程的中断状态的非静态 isInterrupted 方法不会改变中断状态标志。
按照惯例,任何通过抛出 InterruptedException 退出的方法都会在这样做时清除中断状态。然而,中断状态总是有可能被另一个线程调用中断立即再次设置。
现在我很困惑。什么时候发生?如果有中断,线程不应该收到 InterruptedException 吗?
什么时候有人可能会使用这些方法来检查他们的代码?Thread.interrupt(标志)是静态的,所以通过上面的检查,我们实际上检查是否有任何线程被中断?即使是这种情况,根据教程,当线程通过调用静态方法 Thread.interrupted 检查中断时,中断状态将被清除。 或任何通过抛出 InterruptedException 退出的方法都会在这样做时清除中断状态
那么,我错过了什么吗?或者这只是有用的,如果某个线程收到了一个中断,但没有检查它,或者没有抛出它?