Java 为什么InterruptedException是检查异常?

Java 为什么InterruptedException是检查异常?,java,multithreading,interrupted-exception,Java,Multithreading,Interrupted Exception,这是一个关于旧Java的问题,当时我们正在制作自己的线程。一些方法,如Thread.sleep(100)在被另一个线程中断时抛出InterruptedException。据我所知,中断意味着另一条线索在说:让我现在接管 当这种情况发生时,为什么Java要我们处理中断异常 程序员甚至不需要关心线程何时相互中断。他应该能够在线程之间分配工作,并在完成时得到通知。那么Java希望我们处理中断异常的原因是什么呢?至少应该是RuntimeException 程序员甚至不需要关心线程何时相互中断 事实并非如

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

当这种情况发生时,为什么Java要我们处理
中断异常

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

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

事实并非如此。在很多很多情况下,您希望知道请求了中断,但是为了完成您正在做的工作,您会忽略它一点

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

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


正如您所看到的,有太多可能的场景,如果我们无法知道请求了中断,那就太糟糕了。有时候,你会让线死。有时候,你必须清理环境。有时,您希望它完成正在处理的请求,但不接受任何其他请求。

您似乎将线程调度程序和中断混为一谈

线程调度程序是一个本机系统,它将多个线程中的作业划分为多个进程。如果太多线程处于活动状态,调度程序将异步工作。换言之,让我来接手,因为这可能是真的


中断意味着,退出您当前正在做的事情,不要返回到它。实现这一点最实际的方法是例外

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

运行时异常被认为代表编程错误(请参阅)。InterruptedException更像是来自另一个线程的信号。

我想这是为了让开发人员在线程中断时采取适当的操作。线程可能正在执行一些关键任务,它可能需要以正确的方式处理中断。要强制您捕获它,请不要关闭它。这里有一些很好的答案,我同意,这不应该关闭。SIGKILL不会中断线程;它直接杀死了它们,杀死了整个JVM进程。对不起,我的错,我的意思是
SIGINT
。SIGINT也不会在线程上调用
.interrupt()
。它可能会运行您添加的任何关机挂钩。如果它确实中断了线程,可能会造成严重破坏:您可能需要按照非常特定的顺序终止线程,JVM如何知道正确的顺序?谢谢@BrunoReis,您是正确的。我一直认为线程会在
SIGINT
上被中断。我现在必须重温几行清理代码……根据Oracle的说法,“中断意味着,退出当前正在做的事情,不要再回去做”,这是不太正确的。它说:“中断是对线程的一种指示,它应该停止它正在做的事情并做其他事情。由程序员来决定线程对中断的确切响应方式。”。没有标准的行为,比如“不要回头”。中断只是线程向另一个线程发送信号的一种方式,这可能意味着“退出”或者不确定这是如何回答这个问题的-如果InterruptedException未被选中,您上面写的所有内容都将同样容易实现。@Peter检查的事实要求可以抛出异常的API的用户以某种方式显式处理异常。如果未检查且未损坏,它将抛出异常,并可能终止程序,这意味着上述所有文件损坏和连接中断的情况都是可能的。选中它是确保用户绝对不会错过处理异常的重要部分的一种方法。