我已阅读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()来保持中断状态。我仍然非常模糊,所以如果我设置.interrupt?接下来发生什么?有点迷失了......任何输入?
它给我的计划带来了什么价值?请以外行的方式解释,非常感谢:D
答案 0 :(得分:2)
这里重要的是未在示例中编写的代码。
示例中的方法(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
中的getNextTask
时中断线程时,中断就会丢失我上面写的一些代码永远不会停止循环。
IBM网页上的示例的重点是,当您吞下中断时必须非常小心,因为它可能会意外地使线程无法中断。
答案 1 :(得分:0)
只要您知道当前线程将在您的任务完成并返回后终止,只要吞下InterruptedException
即可。
使用某些线程池时可能会出现问题,例如ExecutorService
,通常线程在任务完成后继续运行,等待下一个任务到来。在这种情况下,应该通知池化线程它被中断,以便它可以在这种情况下做任何适当的事情,例如,执行干净的关机并退出。
因此,确保在从例行程序返回之前恢复中断状态是一种良好的做法,也是更安全的。