6

当我们制作自己的线程时,这是关于旧 Java 的一个问题。一些方法,例如当它被另一个线程中断时Thread.sleep(100)抛出一个。InterruptedException现在据我了解,中断意味着另一个线程在说:让我现在接手。

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

程序员甚至不需要关心线程何时相互中断。他应该能够在线程之间分配工作并在完成时收到通知。那么Java要我们处理的原因是什么InteruptedException呢?至少应该是RuntimeException

4

4 回答 4

7

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

这不是真的。在很多很多情况下,您都想知道有人请求了中断,但是您会忽略它一会儿以完成您正在做的工作。

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

在不同的场景中,假设您有一个 HTTP 服务器。假设用户正在访问您的服务器,并从其中下载一个大文件。您想停止服务器。然后应用程序将尝试中断所有工作线程。他们应该怎么做?只是停止下载?或者他们应该等待用户完成下载他们的文件,然后他们才应该死,而不接受任何更多的请求?这两种情况同样有效。

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

于 2013-04-08T03:57:15.297 回答
4

看来您在线程调度程序和中断之间混为一谈。

线程调度程序是一个本地系统,它将来自多个线程的作业划分为进程。如果太多线程处于活动状态,调度程序将异步工作。换句话说,让我暂时接管可能是完全正确的。

中断意味着,退出你当前正在做的事情,不要再回去了。实现这一点的最实用方法是有一个例外。

于 2013-04-08T03:58:07.657 回答
1

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

于 2013-04-08T04:22:26.267 回答
0

InteruptedException当线程被强制中断时抛出一个。这不是通常的情况(即当线程被调度程序切换出上下文时)。例如,当另一个线程手动中断它或进程接收到SIGINT信号时。

于 2013-04-08T04:00:28.757 回答