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

新手上路,请多包涵

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

原文由 Manki 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

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

不要吞下中断

有时抛出 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-

原文由 Brandon E Taylor 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果抛出 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);
}

…捕获块的声明。这基本上意味着它绝不能发生。因此,如果代码在可能发生这种情况的环境中被重新使用,它就会抱怨。

原文由 Christian 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题