3

我一直在阅读有关 InterruptedException 的信息,很明显没有灵丹妙药的解决方案可以在所有情况下正确处理它。

我还没有看到,一些示例代码演示了如果异常处理不当会出现什么问题。当然,我意识到一些效果(例如线程饥饿,我认为是其中之一)很难演示。我想把它限制在演示正确使用Thread.sleep().

您将如何为此设计一个有点现实的示例程序?

到目前为止,这是我的想法:

  1. 制作一个简单的 GUI 应用程序来演示降低的响应能力。会有一个 UI 线程和一个简单的线程池来执行一些阻塞任务。线程池管理器检查正在运行的线程的中断状态来管理它们。SwallowedInterruptedException会导致池中的线程用完,因此应用程序的响应速度会降低。

    这可以帮助指出在托管线程与非托管线程中休眠时的不同处理策略。

  2. 有一堆创建垃圾和睡眠的线程。会有两种类型的线程:一种在中断时恢复中断状态,另一种不(吞下异常)。然后演示将在内存很少的 JVM 中运行应用程序,并且(希望)表明吞下异常会以某种方式抑制垃圾收集或增加其开销(由于调用之间的间隔很长)。

这些想法有意义吗?还有其他(可能更简单)的想法吗?

4

1 回答 1

4

假设您有一个线程,您希望能够通过中断它来关闭它。

public void run() {
   while(!Thread.currentThread().interrupted()) {
       doWork();     
       callMethodWhichIgnoresInterrupted();
   }
}

通过丢弃中断,您可以拥有一个有时无法终止的线程,从而导致资源泄漏,如果不重新启动应用程序就无法修复。

在 95+% 的情况下,忽略任何异常都是一个非常糟糕的主意。这就是为什么它们在 Java 中被检查异常。这些问题不仅限于中断。

于 2011-02-08T08:55:35.823 回答