- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在实践中阅读了并发性。现在我想了解如何处理 InterrruptedException
书中的建议:
- Propagate the exception (possibly after some task-specific cleanup), making your method an interruptible blocking method, too; or
- Restore the interruption status so that code higher up on the call stack can deal with it.
- Only code that implements a thread's interruption policy may swallow an interruption request. General-purpose task and library code should never swallow interruption requests.
前两个陈述对我来说很清楚,但我不明白第三个。你能澄清一下吗?最好提供示例。
The one time it is acceptable to swallow an interrupt is when you know the thread is about to exit. This scenario only occurs when the class calling the interruptible method is part of a Thread, not a Runnable or general-purpose library code, as illustrated in Listing 5. It creates a thread that enumerates prime numbers until it is interrupted and allows the thread to exit upon interruption. The prime-seeking loop checks for interruption in two places: once by polling the isInterrupted() method in the header of the while loop and once when it calls the blocking BlockingQueue.put() method.
public class PrimeProducer extends Thread {
private final BlockingQueue<BigInteger> queue;
PrimeProducer(BlockingQueue<BigInteger> queue) {
this.queue = queue;
}
public void run() {
try {
BigInteger p = BigInteger.ONE;
while (!Thread.currentThread().isInterrupted())
queue.put(p = p.nextProbablePrime());
} catch (InterruptedException consumed) {
/* Allow thread to exit */
}
}
public void cancel() { interrupt(); }
}
我现在不明白加粗的文字。
最佳答案
简答:如果你能应对这种情况,那就忍着吧。
中断异常发生在并行线程中发生的进程被取消或中断时。因此,如果您是唯一对这个事实感兴趣的人,并且您可以处理线程“死”的情况,那么您可以接受它。
这在现实生活中是完全可能的。该策略取决于每种情况。
关于java - 哪些代码可以吞掉interruptedException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42219790/
场景如下。 我实现了一个这样的界面: public interface MessageSourceProvider { MessageSource getMessageSource(Local
这个问题已经有答案了: I want my thread to handle interruption, but I can't catch InterruptedException because
这段代码应该可以编译,不是吗?我究竟做错了什么?我希望代码在显示数组中的每个数字之前短暂暂停。 public static void median(int odd[]) throws Interrup
我正在学习 Java 并发,并尝试了 Java 教程中的示例,并进行了一些实验( try catch 异常)。 public class SleepMessages { public stat
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: Handling InterruptedException in Java 我想知道如何InterruptedExc
这个问题已经有答案了: Handling InterruptedException in Java (7 个回答) 已关闭 6 年前。 我有课 class Foo { static void
我有两个同步适配器,我希望每个同步适配器都等到另一个同步适配器完成后再开始执行。我对信号量使用了以下技术: public class SyncerOne extends AbstractThreade
Given code is working in doInBackground(). Where while loop is always true but i don't know how it c
我有一个以 LinkedBlockingQueue 作为属性的类 A。在 A 的一种方法中,我调用了 LinkedBlockingQueue.put() 方法,因为我想在队列中插入一个项目。但是,如果
我对 Java SE 6 中 Condition 类的 await 方法有一个奇怪的问题。问题是 await 方法在被另一个线程中断时并不总是抛出异常。 在文档中写到在以下情况下会抛出 IE: ...
我很困惑,无法理解为什么不应该吞下 InterruptedException。 IBM 的文章说 当阻塞方法检测到中断并抛出 InterruptedException 时,它会清除中断状态。如果您捕捉
我正在阅读 kathy sierra SCJP 1.5 第 9 章(线程),其中提到: Notice that the sleep() method can throw a checked Inter
我一直在同步块(synchronized block)内收到此异常,在同步块(synchronized block)中我对同步的同一个对象调用等待。一个线程首先被中断是什么意思?其次,发生这种情况的正
对于任何 Java 大师来说,这应该是一个简单的练习。我是新手,只是想确认一件事。 我有一个实现 Runnable 的类,与许多此类类一样,它的 run() 方法有一个无限循环。我想做一些任务,然后睡
我有以下方法,效果很好。我正在尝试测试抛出 InterruptedException 的场景。这就是我目前正在测试的方式,如果我只运行这个单一测试,它会起作用。但是如果我要在我的测试类中运行所有剩余的
我偶然发现了一种情况,我必须处理 InterruptedException,但无法将其向上传递并且不认为我的代码应该被允许吞下它。准确地说,我正在研究分布式锁实现,并且对支持服务的请求可能会中断甚至超
我正在尝试编写一个程序,其中每个类都有单独的类和方法,交叉调用其他类的方法。下面是我想从另一个类的另一个方法调用的编码方法。 public class walk{ public void wa
我有一个 vaadin 应用程序,它使用 hibernate 并在 glassfish 中上传,我们收到此错误: AdmissionWeb:2018-07-03 12:01:06 [WARN ][ht
我有代码,需要等待一段时间作为繁忙等待的一部分(由于遗留代码,我无法更改那么多)。我已经阅读了为什么我应该在此处执行此操作的推理 [1] 和 [2],并且它是显而易见的经验法则。经常这样做。 IIUC
我有这段代码。如果在等待添加到队列时被中断,LinkedBlockingQueue 应该仅抛出 Exception。但这个队列是无限的,所以它应该尽快添加。为什么我的关闭方法会抛出 Interrupt
我是一名优秀的程序员,十分优秀!