Java的Thread.sleep何时会引发InterruptedException?


110

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



1
取决于您的意思是“忽略”。InterruptedException是捕获的异常,所以你不能编译,除非你处理或在其上加入或睡一个任何方法声明这种类型的异常Thread,或电话wait()Object
8bitjunkie 2014年

Answers:


41

通常,您不应忽略该异常。看一下以下论文:

不要吞下中断

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


38

如果InterruptedException抛出,则表示某事想要中断(通常终止)该线程。这是通过调用thread 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块的声明 这基本上意味着它永远不会发生。因此,如果代码在可能发生的环境中重复使用,则会抱怨它。


5
Java中的断言默认关闭。所以最好只扔一个RuntimeException
Evgeni Sergeev


5

sleep()wait()类之类的方法Thread可能会抛出InterruptedException。如果其他人thread想要中断thread正在等待或正在睡眠的状态,则会发生这种情况。


3

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


-7

InterruptedException当睡眠被中断通常是抛出。


13
这是错误的,因为中断的不是睡眠本身,而是运行线程的线程。中断是线程状态。这只会导致睡眠方法被退出。
ubuntudroid
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.