JVM在捕获InterruptedException时需要退出吗?

3

正如标题所示,当我们遇到InterruptedException时,是否需要强制JVM退出?我问这个问题的原因是我对(Unix)中断信号感到困惑。当我们在Java应用程序运行时键入Ctrl-C时,会阻止线程获取InterruptedException吗?

简单来说,
1)为什么会抛出InterruptedException?
2)当JVM被外部中断或终止(例如Unix命令)时,线程是否会被中断?

谢谢

2个回答

6

通常情况下,你不应该在出现 InterruptedException 异常时退出JVM。

InterruptedException 异常可能会在一个线程调用其 interrupt() 方法后在另一个线程中被触发。它与硬件中断或操作系统信号没有任何关系。中断是一种告诉线程停止当前正在执行的任务并尽可能快地退出,而不会使共享内存处于损坏状态的方法。

只有在线程明确说明如何响应中断的情况下才能中断线程。通常情况下,这是响应用户交互(例如按“取消”按钮)时完成的。

通常情况下,中断仅影响单个线程,应用程序的其余部分继续运行。但是,我可以想象在JVM中安装一个信号处理程序,通过优雅地关闭整个服务器来响应信号;这可能会涉及请求处理线程和其他线程的中断。


0

中断异常与JVM错误条件无关,它是休眠线程在正常情况下被唤醒(通过thread.interrupt())时接收到的异常。


1
线程不会休眠。它们会通过调用wait()方法来等待,但是当它们变得可运行时没有异常。还有一种已弃用的线程暂停机制,但也没有使用异常。 - erickson
中断public void interrupt()中断此线程。 首先调用此线程的checkAccess方法,可能会导致抛出SecurityException。 如果此线程在Object类的wait()、wait(long)或wait(long, int)方法的调用中被阻塞,或者在此类的join()、join(long)、join(long, int)、sleep(long)或sleep(long, int)方法的调用中被阻塞,则其中断状态将被清除,并且它将接收到InterruptedException。 - ddyer
好的,我现在明白你的意思了。我之前关注的是“在正常情况下”的短语,但实际上你说的是异常情况——中断,这一点我忽略了。 - erickson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接