我一直在阅读有关InterruptedException的信息,很明显,在所有情况下都没有正确处理它的银弹解决方案。
我还没有看到,是一些示例代码演示了如果异常处理不当会出现什么问题。当然,我意识到一些效果(比如线程饥饿,我认为是其中之一)很难证明。我希望将其限制为证明正确使用Thread.sleep()
。
你会如何为此设计一个有点逼真的示例程序?
到目前为止,我的想法是:
创建一个简单的GUI应用程序来演示响应能力降低。有一个UI线程和一个简单的线程池来执行一些阻塞任务。线程池管理器检查正在运行的线程的中断状态以管理它们。吞下InterruptedException
会导致池中的线程耗尽,因此应用程序的响应速度会降低。
这可以帮助指出在托管线程和非托管线程中睡眠时的不同处理策略。
拥有一堆创建垃圾和睡眠的线程。会有两种类型的线程:在中断时恢复中断状态的线程,以及不中断线程的线程。例外)。然后演示将在具有少量内存的JVM中运行应用程序,并且(希望)显示吞下异常会以某种方式阻止垃圾收集或增加其开销(由于调用之间的间隔很长)。
这些想法有意义吗?还有其他(也许更简单)的想法吗?
答案 0 :(得分:4)
假设你有一个你希望能够通过中断它来关闭的线程。
public void run() {
while(!Thread.currentThread().interrupted()) {
doWork();
callMethodWhichIgnoresInterrupted();
}
}
通过丢弃中断,您可以拥有一个有时无法死的线程,导致资源泄漏而无法在不重新启动应用程序的情况下解决。
95%以上的时间忽略任何异常都是一个非常糟糕的主意。这就是他们在Java中检查异常的原因。这些问题不仅限于中断。