始终忽略在Java中调用Thread sleep()的InterruptedException是否安全

cod*_*aku 6 java multithreading exception

在处理项目时,我遇到了用于生产系统的代码:

public static void sleepUntil(long millisecondToWake) {
    while (true) {
        long currentMillisecond = System.currentTimeMillis();
        if (currentMillisecond >= millisecondToWake) {
            break;
        }
        try {
            Thread.sleep(millisecondToWake - currentMillisecond);
        }
        catch (InterruptedException ignoredException) {
            // do nothing
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我一直坚持不断删除Joshua Bloch在Effective Java中暴露的异常的基本原则,并且支持我自己的调试代码,而其他人确实放弃了异常.到目前为止,我还没有找到一个好主意的案例(有时候捕获已检查的异常并抛出运行时是合理的,但我不是在谈论这些情况).

提前感谢您的任何意见.

Stu*_*ion 5

这是有关此特殊异常的精彩文章:

http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html

但是,基本上,它不应该被忽略,至少代码应该做的是传播中断:

catch (InterruptedException e) { 
    // Restore the interrupted status
    Thread.currentThread().interrupt();
}
Run Code Online (Sandbox Code Playgroud)

作者不在乎他的线程的睡眠是否被中断(这是吞下该异常的正当理由)。但是,在编写代码时作者不了解或未想到的线程中的其他地方可能需要中断:

不管您打算对中断请求采取行动,还是要重新中断当前线程,因为单个中断请求可能有多个“收件人”。标准线程池(ThreadPoolExecutor)工作线程实现是对中断的响应,因此中断在线程池中运行的任务可能具有取消任务和通知执行线程该线程池正在关闭的作用。