3

对于任何 Java Master 来说,这应该是一个简单的做法。作为一个新手,我只想确认一件事。

我有一个实现 Runnable 的类,并且像许多这样的类一样,它的 run() 方法有一个无限循环。我想做一些任务,然后睡一分钟,然后再回来。

如果在线程休眠时遇到中断异常会发生什么?

我认为会发生的是线程被挂起,现在无限循环无助于保持线程运行。我想确认我的理解是否正确。

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

4

4 回答 4

6

错误的。
AnInterruptedException只会终止sleep()调用并引发异常。
只要您适当地处理异常,您的线程就会继续运行。

于 2012-09-14T19:20:25.430 回答
2

您的理解大部分是正确的 - 当您的线程处于睡眠状态时,如果它被中断,这将导致 anInterruptedException被抛出 - 您的代码run()必须捕获它并执行它想做的事情。线程本身不会被挂起 - 因为在该线程上继续执行活动。

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

于 2012-09-14T19:22:48.823 回答
0

线程不会被挂起。

如果您捕获InterruptedException,将在您的异常处理程序中继续执行。

如果你没有抓住InterruptedException,线程将终止。

于 2012-09-14T19:37:48.287 回答
0

InterruptedExceptions 不只是发生。一些异常,如 IOExceptions,由于介质固有的易碎性而无法预测地发生,但中断并非如此。

中断是对线程的故意信号,通常由应用程序在关闭时发送,它应该完成它正在做的事情并停止运行。如果被中断的线程当时恰好在等待或休眠,则线程被唤醒,并且从等待或休眠方法中抛出 InterruptedException。

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

于 2012-09-14T19:41:09.373 回答