管理InterruptedException

时间:2011-08-09 22:58:47

标签: java interrupted-exception

我已阅读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

2 个答案:

答案 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,通常线程在任务完成后继续运行,等待下一个任务到来。在这种情况下,应该通知池化线程它被中断,以便它可以在这种情况下做任何适当的事情,例如,执行干净的关机并退出。

因此,确保在从例行程序返回之前恢复中断状态是一种良好的做法,也是更安全的。