[英]Managing InterruptedException
我已阅读http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html
我决定通过以下方式使我的锁定不可取消任务
try {
lockedRecords.wait();
} catch (InterruptedException e) {
interrupted = true;
}
但是有没有必要
} finally {
if (interrupted) {
Thread.currentThread().interrupt();
}
}
文章说你应该调用 interrupt() 来保持中断状态。 我还是很模糊,那么如果我 set.interrupt 呢? 接下来发生什么? 对此有点迷失......任何输入?
它给我的程序带来什么价值? 请用外行的方式解释,不胜感激:D
这里重要的是示例中未编写的代码。 示例中的方法 ( getNextTask
) 可用于:
while (!Thread.interrupted()) {
Task task = getNextTask(queue);
doSomething(task);
}
System.out.println("The thread was interrupted while processing tasks.");
System.out.println("...stopped processing.");
上面的while
循环将永远执行,除非有人中断了运行此循环的线程。
如果中断状态没有像在getNextTask
中那样重置,但是当有人试图在线程处于 queue.take 中时中断线程时queue.take
,那么中断就会丢失,我上面写的getNextTask
代码将永远不会停止循环。
IBM 网页上示例的全部要点是,在吞下中断时必须非常小心,因为它可能会意外地使线程无法中断。
只要您知道当前线程将在您的任务完成并返回后终止,只需吞下InterruptedException
就可以了。
使用某些线程池时可能会出现问题,例如ExecutorService
,通常线程在任务完成后继续运行,等待下一个任务的到来。 在这种情况下,应该通知池线程它已被中断,以便它可以在这种情况下执行任何适当的操作,例如执行干净的关闭和退出。
因此,在从例行程序返回之前,确保恢复中断的 state 是一种很好的做法,而且更安全。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.