2013-04-08 64 views
6

这是一个关于旧Java的问题,当我们创建自己的线程时。一些方法如Thread.sleep(100)在被另一个线程中断时会抛出InterruptedException。现在据我了解,中断意味着另一条线索在说:现在让我接管。为什么InterruptedException是一个检查的异常?

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

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

+0

我想这是让开发人员在线程中断时采取适当的行动。线程可能正在做一些关键任务,可能需要以正确的方式处理中断。 – 2013-04-08 03:56:10

+0

逼你抓住它。 – EJP 2013-04-09 01:45:00

+2

请不要关闭它。这里有一些很好的答案 – Victor 2013-04-09 03:06:09

回答

6

程序员甚至不应该需要关心,当线程打断对方

这是不正确的。在许多情况下,您想知道中断已经被请求,但您会稍微忽略一点,以完成您正在做的工作。

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

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

正如你所看到的,有太多可能的场景,如果我们无法知道中断已被请求,那将是非常可怕的。有时候,你只会让线程死亡。有时候,你必须清理环境。有时,您希望它完成正在处理的请求,但不接受更多请求。

+2

不知道这是如何回答这个问题的 - 如果InterruptedException未被选中,上面所写的所有内容都可以轻松实现。 – Peter 2016-07-13 05:12:03

+0

@Peter它被检查的事实要求您的API的用户可以抛出异常,以明确的方式处理它。如果它没有被检查和未被捕获,它只会抛出异常并可能终止程序,这意味着所有上述的损坏文件和中断连接的情况都是可能的。进行检查是确保用户绝对不会错过处理异常的重要部分的一种方法。 – 2017-07-24 09:01:50

3

看来你在线程调度器和中断之间混合。

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

一个中断意味着,退出你正在做的事情,并且不回到。实施这个最实际的方法是例外。

+0

根据Oracle的说法,http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html,*“一个中断的意思是,退出你现在正在做的事情,并且不要再回到它* *“*,不太正确。它说:“中断表示线程应该停止它正在做的事情并做其他事情。**由程序员决定线程如何响应中断**”。没有标准的行为,比如“不要回去”。中断只是一种线程向另一线程发送信号的方式之一,并且这可以被实现为意味着“退出”或不是 – 2013-04-08 22:26:27

0

当线程被强制中断时,会抛出InteruptedException。这不是一种常见的情况(即当线程由调度程序切换出去时)。当另一个线程manually interupts it 或进程接收到 SIGINT信号 时,会出现这样的示例。

+0

SIGKILL不会中断线程;它直接杀死它们,它杀死了整个JVM进程。 – 2013-04-08 04:07:14

+0

对不起,我的意思是'SIGINT'。 – SimonC 2013-04-08 04:11:24

+0

SIGINT不会在线程上调用'.interrupt()'。它只会运行你添加的任何关闭钩子。如果它确实中断了线程,可能会造成严重破坏:您可能需要按照特定的顺序终止线程,JVM如何知道正确的顺序? – 2013-04-08 04:14:57

相关问题