为什么InterruptedException是一个经过检查的异常?

时间:2015-02-17 21:25:16

标签: java multithreading shutdown

在使用Java中的线程时,处理InterruptedException似乎是我身边的一个特殊刺。我很欣赏它在我的线程被终止时被抛出的事实,因此我有机会进行清理。对我来说似乎很奇怪的是,它不是未经检查的异常。

这会产生以下问题: a)如果我想在我的线程应用程序中使用现有框架,我强制将其转换为框架接口接受的异常。因此,框架通常会误解它,而不是按原样清理或传播它。

b)除非为堆栈中的每个调用严格声明InterruptedException(并且它通常不是因为a),否则很难干净地关闭。

如果InterruptedException被取消选中,那么它似乎会有更高的可能性,并且通常会导致线程和应用程序的干净关闭。为什么不呢?

1 个答案:

答案 0 :(得分:6)

中断应该是合作的。我认为设计人员希望避免一种情况,即你可以通过中断线程来吹走线程,线程没有代码来处理这种可能性。目的似乎是让Runnable代码明确决定如何处理中断。很多框架或语言代码似乎都是关于决定谁应该做出什么样的责任,并试图使正确的用法显而易见,以便最大限度地减少用户被烧毁的程度。这是其中一项判断。

在检查InterruptedException时,最糟糕的情况是捕获了异常,但其方式并不是非常有用。 (实际上绝对最坏的情况是中断标志没有被恢复,线程中的任何后续代码都没有意识到中断发生了。)如果未选中InterruptedException(或者如果你将它包装在RuntimeException中,如在链接的文章中所示)注释),异常可能无法处理并继续终止线程,如果线程不在停止位置,这可能非常糟糕。

使用未经检查的InterruptedExceptions,玩具示例和简单代码可以更好地工作;没有人会费心去捕捉异常并且它会起作用。然而,在实际代码中做大量工作时,这可能被认为是有害的。

检查异常是为了确保开发人员知道可以抛出异常,以便开发人员可以避免在线程正在进行的工作中抛出异常的情况,这可能会使工作部分 - 做得很糟糕。