我很困惑,无法理解为什么不应该吞掉InterruptedException。
IBM的文章说
当阻塞方法检测到中断并抛出InterruptedException时,它将清除中断状态。如果捕捉到InterruptedException,但无法重新抛出它,则应保留中断发生的证据,以便调用堆栈上更高的代码能够获悉中断,并在需要时对其做出响应
public class TaskRunner implements Runnable {
private BlockingQueue<Task> queue;
public TaskRunner(BlockingQueue<Task> queue) {
this.queue = queue;
}
public void run() {
try {
while (true) {
Task task = queue.take(10, TimeUnit.SECONDS);
task.execute();
}
}
catch (InterruptedException e) {
Thread.currentThread().interrupt();//preserve the message
return;//Stop doing whatever I am doing and terminate
}
}
}
还请解释一下上面的规则?
看看这个示例,我们假设它在线程/线程池上下文中运行。
public void run() {
// Honor interrupts so that you can stop/kill the task
while (!Thread.currentThread().interrupted()) {
this.doSomeChunkOfWork();
}
}
上面的代码是一个很好的例子,说明了如何编写一个任务,该任务可以被中断并以块的方式处理数据(想想从某个源读取数据并以部分的方式处理数据)。现在让我们假设DoSomeChunkOfWork
被中断,并且捕获了一个异常。除非再次设置标志或维护标志的中断状态,否则run
方法将无法知道当方法调用返回时调用堆栈深处的处理被中断,这将破坏我们良好的逻辑。
这就是为什么您总是将状态设置回调,以便调用堆栈中的方法知道线程是否真的中断了。我想做一个类比,就是“不要把灰尘扫到地毯下面”。:)
问题内容: 我是一个完整的初学者。 我已阅读了有关解决方案的Google文档。我在互联网上搜索了同样的内容。 但。一切似乎都是技术性的。 据我了解,.Flush有助于在功能出现时立即执行这些功能,而无需将它们捆绑在一起。 我对吗? 如果不是的话,外行人的含义是什么?并请举一个简单的例子。谢谢。 问题答案: 程序员在希望确保在继续之前将先前代码的输出和/或效果写入电子表格时会使用。如果您不这样做,则
为什么会有例外 静默忽略?我可以看到流在打印后停止,但没有记录任何内容。请注意,问题不是一般的日志配置,因为如果我在我的文件中设置,我会看到很多输出。
本文向大家介绍为什么HTML5里面我们不需要DTD?相关面试题,主要包含被问及为什么HTML5里面我们不需要DTD?时的应答技巧和注意事项,需要的朋友参考一下 先说一下什么是DTD或者说我们为什么在html5之前需要使用DTD 下面是DTD的作用: 通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。 通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。 应用程
问题内容: 据我所知,以下两个代码段将达到相同的目的。为什么有块呢? 代码A: 代码B: 问题答案: 如果您未处理的异常被抛出会怎样?(我希望你不会抓到…) 如果从try块内部返回会怎样? 如果catch块引发异常会怎样? 一个代码块确保 无论 您退出该代码块(以几种方式明确地中止整个过程),该代码块都将被执行。这对于确定性清除资源很重要。
问题内容: 我正在构建一个小型应用程序,并在表之间建立外键关系。但是我对为什么我真的需要这个感到困惑?有什么好处- 在编写不需要执行任何联接的查询时,它对我有帮助吗?这是我的数据库的示例片段: 两者之间存在关键关系。和。 我可以执行这样的查询吗? 既然MySQL应该知道表之间的关系?如果不是,那么外键在数据库设计中的真正功能是什么? 问题答案: 外键提供引用完整性。外键列中的数据经过验证-该值只能