Java的Thread.sleep什么时候抛出InterruptedException?

时间:2009-07-06 15:01:52

标签: java multithreading sleep interrupted-exception interruption

Java的Thread.sleep什么时候抛出InterruptedException?忽视它是否安全?我没有做任何多线程。我只想等几秒钟再重试一些操作。

6 个答案:

答案 0 :(得分:36)

您通常不应忽略该异常。看看下面的论文:

  

不要吞下中断

     

有时抛出InterruptedException是   不是一个选项,例如当Runnable定义的任务调用时   可中断的方法。在这种情况下,你不能重新抛出   InterruptedException,但您也不想做任何事情。当一个   阻塞方法检测到中断并抛出InterruptedException,   它清除了中断状态。如果你捕获InterruptedException   但不能重新抛出它,你应该保留证据   发生中断,以便调用堆栈上的代码可以更高   了解中断并在需要时对其进行响应。这个任务   通过调用interrupt()来“重新中断”当前来完成   thread,如清单3所示。至少,无论何时捕获   InterruptedException并且不重新抛出它,重新中断当前   返回前的线程。

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-

答案 1 :(得分:32)

如果抛出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块的声明。这基本上意味着它永远不会发生。因此,如果代码在可能发生的环境中重复使用,它会抱怨它。

答案 2 :(得分:12)

Java专家简报(我可以毫无保留地推荐)有一个interesting article on this,以及如何处理InterruptedException。这非常值得阅读和消化。

答案 3 :(得分:4)

在单线程代码中处理它的一种简单明了的方法是捕获它并在RuntimeException中将其返回,以避免为每个方法声明它。

答案 4 :(得分:1)

sleep()的{​​{1}}和wait()等方法可能会抛出Thread。如果其他InterruptedException想要中断正在等待或正在睡觉的thread,就会发生这种情况。

答案 5 :(得分:-4)

睡眠中断时通常会抛出InterruptedException