【发布时间】:2015-02-17 21:25:16
【问题描述】:
在使用 Java 中的线程时,处理 InterruptedException 似乎是我的一个特别棘手的问题。我很欣赏它在我的线程终止时抛出的事实,因此为我提供了清理的机会。我觉得奇怪的是它不是一个未经检查的异常。
这会产生以下问题: a) 如果我想在我的线程应用程序中使用现有框架,我必须强制将其转换为框架接口接受的异常。因此,框架通常会误解它,而不是按照应有的方式清理或传播它。
b) 除非对堆栈中的每个调用都严格声明了 InterruptedException(通常不是因为 a),否则很难干净地关闭。
如果 InterruptedException 没有被选中,它似乎更有可能被正确使用并导致线程和应用程序的干净关闭。为什么不呢?
【问题讨论】:
-
我可以想象,在实现多线程解决方案时,让这个异常被选中还是不被选中的决定归结为可见性。有点像“嘿,你真的应该注意这一点并把它做好。”事物。在编译时强制执行此操作会迫使实施者至少考虑被中断的问题。如果不加以检查,则会将此问题的可见性转移到地平线以下。
-
投票结束,因为除了指定的人,我们只能做出有根据的猜测。
-
(а) 是您的框架的问题,而不是
InterruptedException本身的问题。 (b)RuntimeException表示编程错误;InterruptedException不是编程错误的结果。 -
InterruptedExceptions 处理起来特别复杂,当它们发生时你需要关心线程的中断标志,它只会发生在阻塞操作中。为此,实际进行检查是一个很好的理由。
-
@eckes:我不明白异常处理是否复杂与是否应该检查有什么关系。
标签: java multithreading shutdown