Java 的 Thread.sleep 何时抛出 InterruptedException?

Java 的 Thread.sleep 何时抛出 InterruptedException?无视它安全吗?我没有做任何多线程处理。我只是想等几秒钟再重新尝试一些操作。

132636 次浏览

一般来说,你不应该忽视这个例外,看看下面的文章:

不要忍气吞声

有时抛出 InterruptedException 是 而不是选项,例如当由 Runnable 定义的任务调用 在这种情况下,您不能重新抛出 异常,但是您也不希望什么都不做 阻塞方法检测到中断并抛出 InterruptedException, 它会清除中断状态 但不能重新抛出,你应该保存的证据 发生了中断,因此调用堆栈上更高的代码可以 学习中断,如果它愿意的话就回应它。这个任务 是通过调用中断()来“重新中断”当前 线程,如清单3所示 异常并且不重新抛出它,重新中断当前 在返回之前穿线。

public class TaskRunner implements Runnable {
private BlockingQueue<Task> queue;
 

public TaskRunner(BlockingQueue<Task> queue) {
this.queue = queue;
}
 

public void run() {
try {
while (true) {
Task task = queue.take(10, TimeUnit.SECONDS);
task.execute();
}
}
catch (InterruptedException e) {
// Restore the interrupted status
Thread.currentThread().interrupt();
}
}
}

点击这里查看整篇文章:

Http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html?ca=drs-

在单线程代码中处理它的一种可靠而简单的方法是捕获它并在 RuntimeException 中反向处理它,以避免为每个方法声明它。

Java 专家通讯(我可以毫无保留地推荐)有一个 有趣的文章,以及如何处理 InterruptedException。这本书很值得一读和消化。

当睡眠被中断时,通常会引发 InterruptedException

如果抛出 InterruptedException,则意味着有东西想要中断(通常是终止)该线程。这是由对线程 interrupt()方法的调用触发的。Wait 方法检测到这一点,并抛出一个 InterruptedException,这样 catch 代码就可以立即处理终止请求,而不必等到指定的时间结束。

如果您在单线程应用程序(以及一些多线程应用程序)中使用它,则永远不会触发该异常。通过使用空 catch 子句忽略它,我不建议这样做。抛出 InterruptedException清除线程的中断状态,因此如果处理不当,信息就会丢失。因此,我建议参选:

} catch (InterruptedException e) {
Thread.currentThread().interrupt();
// code for stopping current task so thread stops
}

再次设置该状态。然后,完成执行。这将是正确的行为,甚至强硬从未使用。

或许更好的做法是加上以下内容:

} catch (InterruptedException e) {
throw new RuntimeException("Unexpected interrupt", e);
}

语句到 catch 块。这基本上意味着它永远不会发生。因此,如果代码在可能发生这种情况的环境中被重用,它就会抱怨。

Thread类的 sleep()wait()这样的方法可能抛出一个 InterruptedException。如果其他 thread想要中断正在等待或睡眠的 thread,就会发生这种情况。

根据个人经验,我只是把 thread.sleep()改成了 this.sleep()

来自 医生:

当线程在等待时抛出 InterruptedException, 睡眠,或以其他方式占用线程,并且线程被中断 在活动之前或期间。

换句话说,当某些代码在特定线程上调用了 interrupt()方法时,就会发生 InterruptedException。它是一个已检查的异常,Java 中的许多阻塞操作都可能抛出它。

中断系统的目的是提供另一种工作流,允许线程中断其他线程中的任务。中断不一定会中断正在运行的线程,但它也可以请求线程在下一个方便的时机中断自己。

线程可能会因为以下几个原因而被阻塞:

  • 等待从 Thread.sleep()中醒来
  • 等待获取一个锁,等待 I/O 完成
  • 等待另一个线程的计算结果等等。

所有阻塞方法通常都会抛出 InterruptedException,以便能够处理它并执行纠正操作。

然而,在大多数情况下,由于我们的代码是 Runnable 的一部分,在这种情况下,我们必须捕获它并恢复状态。

Java 中有很多抛出 异常的方法,例如:

  • 对象类:

    • Thread.sleep()
    • Thread.join()
    • wait()
  • BlockingQueue:

    • put()
    • take()