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

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


答案 1

通常不应忽略该异常。请看以下白皮书:

不要吞咽中断

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


答案 2

如果抛出 an,则表示某些内容想要中断(通常终止)该线程。这是由对 threads 方法的调用触发的。wait 方法检测到并引发 一个,以便 catch 代码可以立即处理终止请求,而不必等到指定的时间结束。InterruptedExceptioninterrupt()InterruptedException

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

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

这再次设置了该状态。之后,完成执行。这将是正确的行为,即使是艰难的从未使用过。

更好的做法是添加以下内容:

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

...语句到捕获块。这基本上意味着它绝不能发生。因此,如果代码在可能发生的环境中重复使用,它会抱怨它。