Java中断异常挂起线程?

Java中断异常挂起线程?,java,java.util.concurrent,Java,Java.util.concurrent,这对于任何Java大师来说都应该是一个简单的例子。作为一个新手,我只想确认一件事 我有一个实现Runnable的类,和许多这样的类一样,它的run()方法有一个无限循环。我想做些事情,然后睡一会儿,然后再回来 如果在线程睡眠时遇到中断的异常,会发生什么情况 我认为会发生的是线程被挂起,而现在无限循环对保持线程运行没有任何帮助。我想确认一下我的理解是否正确 如果发生这种情况,那么重新启动线程的可能解决方案是什么?错误。 InterruptedException只会终止sleep()调用并引发异常。

这对于任何Java大师来说都应该是一个简单的例子。作为一个新手,我只想确认一件事

我有一个实现Runnable的类,和许多这样的类一样,它的run()方法有一个无限循环。我想做些事情,然后睡一会儿,然后再回来

如果在线程睡眠时遇到中断的异常,会发生什么情况

我认为会发生的是线程被挂起,而现在无限循环对保持线程运行没有任何帮助。我想确认一下我的理解是否正确

如果发生这种情况,那么重新启动线程的可能解决方案是什么?

错误。
InterruptedException
只会终止
sleep()
调用并引发异常。

只要适当地处理异常,线程将继续运行。

您的理解基本正确-当线程处于睡眠状态时,如果它被中断,这将导致抛出一个
InterruptedException
run()
中的代码必须捕获它并执行它想要执行的操作。线程本身不会被挂起,因为活动执行将在此线程上继续


在catch块中处理
InterruptedException
后,您可能希望继续执行线程。

线程将不会挂起

如果捕获到
中断异常
,将在异常处理程序中继续执行


如果您没有捕捉到中断异常,线程将终止。

中断异常不会发生。有些异常,如IOExceptions,由于介质固有的片状,会发生不可预测的情况,但中断的情况并非如此

中断是一种故意发送给线程的信号,通常在应用程序关闭时由应用程序发送,表示它应该完成正在做的事情并停止运行。如果被中断的线程恰好在等待或休眠,那么该线程将被唤醒,并从wait或sleep方法抛出InterruptedException


像java.util.concurrent和guava这样的有用库使用中断来取消线程。如果您试图将它们用于其他用途,则无法使用这些库。

请注意,InterruptedException最常用于向线程发出信号,表示它应该停止正在执行的操作。因此,捕获并忽略此异常是让应用程序在关机时挂起的一个好方法。@jtahlborn,关于
中断异常后的重要性和处理方法,您是对的,但问题不在于此。最确定的问题在于此。OP正在询问如何忽略一个中断的EXCEPIONT。我只是补充一点警告,那实际上可能不是一件好事;因为我现在知道我的线程没有终止,所以我想吃掉InterruptedException。但我看到很多地方有人建议不要把IE吃掉。。。那么这里有什么建议?如果问题是关于如何忽略IE,那么我可以说它的措辞不够清晰。尽管如此,IE不应被忽略,接收线程应及时清理和关闭仍然是正确的。在
run()
方法中-除了捕获IE之外别无选择-这是一个已检查的异常,您不能将其放入
throws
子句中。在其他可以这样做的地方,是的,你可以让它冒泡出来。@Bhaskar:是的,你必须捕获它并将它包装在未检查的异常中,才能一直得到它。如果我将线程的状态设置为被thread.currentThread().Interrupt();在我发现例外的地方,这应该很有帮助。如果阅读是你的专长。。。