这应该是任何Java Master的简单方法。我是一个新手只是想确认一件事。
我有一个实现Runnable的类,和许多这样的类一样,它的run()方法有一个无限循环。我想做一些任务,然后睡一会儿然后再回来。
如果在线程处于休眠状态时遇到中断异常会发生什么?
我认为会发生的是线程被暂停,现在无限循环无助于保持线程运行。我想确认一下我的理解是否正确。
如果发生了这种情况,那么再次启动线程的可行解决方案是什么?
你的理解大多是正确的 - 当你的线程处于休眠状态时,如果它被中断,这将导致InterruptedException
被抛出 - 你在run()
中的代码必须捕获它并做它想做的事情。线程本身不会被挂起 - 因为在此线程上继续执行活动。
在catch块中处理InterruptedException
后,您可能希望继续执行该线程。
错误。
InterruptedException
将终止sleep()
调用并抛出异常。
只要适当地处理异常,您的线程就会继续运行。
线程不会被暂停。
如果你捕获InterruptedException
,执行将继续在你的异常处理程序中。
如果你没有捕获InterruptedException
,线程将终止。
InterruptedExceptions不会发生。一些例外,如IOExceptions,由于介质固有的瑕疵而不可预测地发生,但中断不是这种情况。
中断是一个故意的线程信号,通常由应用程序在关闭时发送,它应该完成它正在做的事情并停止运行。如果当前正在等待或休眠的线程正在等待或休眠,则线程被唤醒并且从wait或sleep方法抛出InterruptedException。
像java.util.concurrent和guava这样有用的库使用中断来取消线程。如果您尝试将它们用于其他内容,则无法使用这些库。