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

时间:2013-04-08 03:51:27

标签: java multithreading interrupted-exception

当我们制作自己的主题时,这是关于旧Java的问题。像Thread.sleep(100)这样的方法在被另一个线程中断时抛出InterruptedException。据我所知,中断意味着另一个线索在说:让我接手吧。

当发生这种情况时,为什么Java要我们处理InterruptedException

程序员甚至不需要关心线程是否相互中断。他应该能够在线程之间划分工作,并在完成后进行通知。那么Java希望我们处理InteruptedException的原因是什么?至少它应该是RuntimeException

4 个答案:

答案 0 :(得分:7)

  

程序员甚至不需要关心线程何时互相打断

事实并非如此。在许多情况下,您想要知道已经请求了中断,但是您将忽略它以完成您正在执行的工作。

例如,假设一个线程打开一个文件并开始编写一些数据。然后,该线程阻塞,等待计算其余数据。假设第二个线程试图中断第一个线程。它该怎么办?只是死了,也许你最终得到一个腐败,不完整的文件?它应该通过删除它开始写的文件来清理吗?它应该忽略中断请求并等待它必须写入的数据结束吗?它是否应该写出“我在这里被打断”的意思,以便下次可以从那时起继续工作?

在另一种情况下,假设您有一台HTTP服务器。假设用户正在访问您的服务器,比如从中下载一个大文件。您想要停止服务器。然后,应用程序将尝试中断所有工作线程。他们该怎么办?只需停止下载?或者,他们是否应该等待用户完成下载文件,之后他们应该死掉,而不再接受任何请求?这两种情况同样有效。

如您所见,有太多可能的情况,如果我们无法知道已经请求中断,那将会很糟糕。有时候,你只会让线程死掉。有时,您必须清理环境。有时,您希望它完成正在处理的请求,但不再接受任何请求。

答案 1 :(得分:4)

似乎你在线程调度程序和中断之间混合。

线程调度程序是一个本机系统,它将作业从多个线程划分为进程。如果有太多线程处于活动状态,则调度程序将异步工作。换句话说,让我现在接管可能是真的。

中断意味着,退出当前正在做的事情并且不要回到它。实现这一目标最实用的方法是例外。

答案 2 :(得分:0)

强制中断线程时抛出InteruptedException。这不是通常的情况(即,当线程由调度程序切换出上下文时)。示例是当另一个线程manually interupts it 或进程收到SIGINT信号时。

答案 3 :(得分:0)

RuntimeExceptions应该表示编程错误(参见http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html)。 InterruptedException更像是来自另一个线程的信号。