124

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

4

7 回答 7

50

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

不要吞下中断

有时抛出 InterruptedException 不是一种选择,例如当 Runnable 定义的任务调用可中断方法时。在这种情况下,您不能重新抛出 InterruptedException,但您也不想什么都不做。当阻塞方法检测到中断并抛出 InterruptedException 时,它会清除中断状态。如果您捕获了 InterruptedException 但无法重新抛出它,您应该保留中断发生的证据,以便调用堆栈上较高的代码可以了解中断并在需要时对其进行响应。这个任务是通过调用 interrupt() 来“重新中断”当前线程来完成的,如清单 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-

于 2009-07-06T15:06:23.433 回答
47

如果InterruptedException抛出 an 则意味着有东西想要中断(通常终止)该线程。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 块。这基本上意味着它绝不能发生。因此,如果代码在可能发生的环境中重复使用,它会抱怨它。

于 2014-03-24T22:30:23.703 回答
11

Java 专家时事通讯(我可以毫无保留地推荐)对此有一篇有趣的文章,以及如何处理InterruptedException. 非常值得阅读和消化。

于 2009-07-06T15:15:59.957 回答
4

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

于 2017-04-02T15:35:39.727 回答
3

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

于 2009-07-06T15:13:59.710 回答
0

从个人经验来看,我只是换成thread.sleep()this.sleep()

于 2022-01-13T02:24:09.057 回答
-7

InterruptedException通常在睡眠中断时抛出。

于 2011-11-17T16:50:26.737 回答