我正想通过Oracle的Java教程的主题,我看到这个例子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而退出的方法在清除中断状态时会清除中断状态
因此,我是否错过了某些东西?或者这只是有用的,如果某个线程收到中断,但不检查它,或不扔它?
问题的症结在于你要么手动检查你的线程的中断状态,要么你会处理一个'InterruptedException'。 – Perception