2015-02-17 68 views
6

在Java中使用线程时,处理InterruptedException似乎是我身边的一个棘手问题。我很欣赏它在我的线程被终止时抛出的事实,因此为我提供了清理的机会。我觉得奇怪的是,它不是未检查的异常。为什么中断异常检查异常?

这就产生了以下问题: 一)如果我想在我的线程应用程序使用现有的框架,我被迫将其转换为框架接口接受一个例外。因此,框架通常会曲解它,而不是像它应该清理或传播它。

b)除非堆栈中每次调用严格声明InterruptedException(并且通常不是因为a)),否则很难完全关闭。

如果InterruptedException被取消选中,它看起来会有更高的可能性被正确使用,导致线程和应用程序的整体关闭。为什么不是?

+0

我想象一下,在执行多线程解决方案时,决定将此异常检查与未检查归结为可见性。 “嘿,你应该真的注意这一点,并做好准备。”事情。在编译时强制执行此操作会迫使实施者至少考虑被中断的问题。如果不加以控制,将会将这个问题的可见度提高到地平线以下。 – 2015-02-17 21:36:18

+1

投票结束,因为除了指定它的人之外,我们只能进行有根据的猜测。 – Hannes 2015-02-17 21:38:11

+1

(а)是你的框架问题,而不是'InterruptedException'本身。 (b)'RuntimeException'表示编程错误; 'InterruptedException'不是编程错误的结果。 – dasblinkenlight 2015-02-17 21:42:31

回答

3

中断应该是合作的。我认为设计师想要避免一种情况,你可以通过中断它来阻止线程,线程没有代码来处理这种可能性。意图似乎是让Runnable代码明确决定如何处理中断。很多框架或语言代码似乎都是关于决定应该承担哪些责任,并试图明确正确的用法,以最大限度地减少严重用户被烧毁的情况。这是那些判断要求之一。

由于InterruptedException被检查,最坏的情况是异常被捕获,但以一种不太有用的方式。如果未选中,则异常可能会处于未处理状态,并继续终止该线程,如果该线程不在停止位置,则该线程可能非常糟糕。

此外,很明显,设计师倾向于在检查事项方面犯错。所以这符合这种趋势。

+0

我同意中断是应该是合作的。如果例外情况未被检查,则会提供“尽力而为”的折中方案。你可以尽最大努力去合作,或者忽略它,但是无论哪种方式,你将会被关闭,而不是在可能的状态下继续运行。 – Andy 2015-02-17 21:46:45

+2

@安迪:会有很好的分数。无论如何,我并不喜欢检查异常。 – 2015-02-17 22:00:19