为什么需要在Sleep中捕获InterruptedException?

时间:2012-01-08 03:23:01

标签: java

  

可能重复:
  When does Java's Thread.sleep throw InterruptedException?

我看到我们必须在Thread.Sleep方法中捕获InterruptedException,为什么?我从未在实时中看到过这种异常。任何线索?

2 个答案:

答案 0 :(得分:3)

如果线程#1正在休眠,而另一个线程中断它,则会发生这种情况。这通常是尝试停止线程#1。例如,线程#1正在休眠,同时执行一些长时间运行的任务(可能在后台)并且用户点击取消按钮。

答案 1 :(得分:1)

当线程正在等待,休眠或以其他方式占用时,抛出IterruptedExeption,并且在活动之前或期间线程被中断。有时,方法可能希望测试当前线程是否已被中断,如果是,则立即抛出此异常。以下代码可用于实现此效果:

if (Thread.interrupted())  // Clears interrupted status!
{
  throw new InterruptedException();
}
  

每个线程都有一个与之关联的布尔属性,表示其中断状态。中断状态最初为假;当一个线程被一些其他线程通过调用Thread.interrupt()中断时,会发生两件事之一。如果该线程正在执行低级别可中断阻塞方法(如Thread.sleep(),Thread.join()或Object.wait()),则会解除阻塞并抛出InterruptedException。否则,interrupt()仅设置线程的中断状态。在中断线程中运行的代码可以稍后轮询中断状态以查看是否已请求停止它正在执行的操作;可以使用Thread.isInterrupted()读取中断状态,并且可以使用命名不佳的Thread.interrupted()在单个操作中读取和清除中断状态。 See


没有办法简单地在java中停止正在运行的线程(甚至不考虑使用已弃用的方法stop())。在java中停止线程是合作的。调用Thread.interrupt()是告诉线程停止它正在做什么的一种方法。如果线程处于阻塞调用中,则阻塞调用将抛出InterruptedException,否则将设置线程的中断标志。

问题在于阻止sleep()wait()之类的调用可能需要很长时间才能完成检查。因此他们抛出InterruptedException。 (但是,当isInterrupted被抛出时,InterruptedException被清除。)