我在实践中读到了一致性。现在我想了解如何处理InterruptedException
来自书籍的建议:
-传播异常(可能在特定于任务的清理之后),使您的方法也成为可中断的阻塞方法;或者,恢复中断状态,以便调用堆栈中更高级别的代码可以处理它
-只有实现线程中断策略的代码才能吞咽中断请求。通用任务和库代码绝不应吞没中断请求。
前两种说法我很清楚,但第三种我不明白。你能澄清一下吗?最好提供示例。
吞下中断是可以接受的一次是当您知道线程即将退出时。这种情况只发生在调用可中断方法的类是Thread的一部分,而不是Runnable或通用库代码的时候,如清单5所示。它创建一个枚举素数直到被中断的线程,并允许线程在中断时退出。素数搜索循环在两个地方检查中断:一次是通过轮询time循环头中的isInterunc()方法,一次是当它调用阻塞BlockingQueue.put()方法时。
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(); }
}
我现在不明白加粗的文字。
假设我们编写了一个实用程序代码,并且有一些依赖于我们的代码的临床代码。如果发生InterruptedException
,它不应该在实用程序方法中消耗(在try块中),它应该被抛出,并且当InterruptedException
清除中断
标志时,它必须通过调用中断
方法再次设置为true。
它是需要处理在发生中断异常时要做出的决定的核心代码。该核心代码可能取决于中断标志或中断异常来终止循环、结束线程的执行或任何其他决定。
此外,实用程序或库是从高级客户端代码调用的低级代码。理想情况下,低级别应该发布这样的异常,以便让更高级别的代码管理它。
ExecutorService
将是第三条语句的示例。
这协调在同一个“实际”线程上执行多个runnables(/allables)。
如果一个runnable在执行时被中断,则该中断不应影响后续runnable的执行。
因此,ExecutorService应该吞下中断,从中断的可运行性的角度对其进行适当的处理,以便允许在下一次可运行时重用线程。
简而言之:如果你能处理好这种情况,就可以吞下它。
中断的异常发生在该并行线程中发生的进程被取消或中断时。因此,如果您是唯一对该事实感兴趣的人,并且您可以处理该线程“死”的情况,那么您可以吞下它。
这在现实生活中是完全可能的。策略取决于每种情况。
问题内容: 在哪里可以找到javax.crypto源代码? --update 感谢OpenJdk版本,但是jdk6版本呢? 问题答案: 下载链接 http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/tip/src/share/classes/javax/crypto(OpenJDK版本) http://download.java.net/jdk6/sourc
问题内容: 我试图在glibc源代码中找到select()源代码(Linux,i386架构),但我找不到任何东西(与所述体系结构有关) 谁能指出我的select()源代码? 问题答案: select()不是libc的函数,而是内核函数,因此您需要查看内核源代码。 您可以通过查看手册页来说明这一点:如果在第2节中,则为内核函数;如果在第3节中,则为标准C库的函数,在您的情况下为glibc。 编辑:像
问题内容: 我想看看Java API中的方法是做什么的。所以我想要JDK源代码。在重新安装Linux之前,我先安装了包含所有正式源代码的软件包。我只需要告诉Eclipse这个文件在哪里,就可以看到代码。但是现在我没有文件了… 所以问题是:在哪里可以找到它? 问题答案: 你尚未说出所需的版本, JDK 8源代码的存档以及JDK 7和JDK 6。 此外,你可以浏览或克隆的Mercurial库:8,7,
问题内容: 我正在搜索rt.jar的源代码以获取Oracle JRE / JDK 6 Update22。交付随附的src.zip并不包含所有源代码,例如sun。*(例如sun.reflect.Reflection)。 )包丢失。 在哪里可以获得完整的src.zip? 问题答案: 这个答案写于2010年,当时世界大不相同。如果仅需要JRE类的源代码,请在JDK构建中使用JRE-包括的src.zip文
问题内容: 我想尝试查找Python标准库中某些模块的源代码,但找不到它们。下载python tarball后,我尝试在modules目录中查找,但是它主要包含.c文件。我还尝试查看了OS(mac osx)随附的python所在的目录,该目录中包含它的模块,并且那里似乎主要包含.pyc和.pyo文件。如果有人可以帮助我,我将不胜感激。 (我尝试了问题“如何找到Python模块源的位置?”中的建议,
valgrind快速启动页面提到: 这将我引向这样一个问题:是否有充分的理由不在生产中从程序中消除这样的错误?发布包含此类错误的程序有什么好处吗?如果有,开发人员如何保护它的安全,尽管据我所知,包含此类错误的程序可以不可预测地运行,并且无法对其行为做出一般假设?如果是这样,你能提供真实世界的例子,说明程序运行时有这些错误比没有错误更好吗?