1
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
System.out.println("Interrupted, NOT PRINTED");
}
System.out.println ("This statement is printed");

在这段代码中,sleep 会引发一个中断的异常,但这不会在输出中打印 catch 语句。为什么?

4

1 回答 1

3

您应该阅读sleep 方法的完整Javadoc (注意重点):

睡觉

public static void sleep(long millis) throws InterruptedException

使当前执行的线程休眠(暂时停止执行)指定的毫秒数,取决于系统计时器和调度程序的精度和准确性。该线程不会失去任何监视器的所有权。

参数
     millis - 睡眠时间长度(以毫秒为单位)。
抛出
InterruptedException -如果任何线程中断了当前线程。抛出此异常时清除当前线程的中断状态。

除非睡眠线程被实际中断,否则不会抛出异常。这是更可靠地测试您正在检查的行为的代码版本:

Thread targetThread = new Thread() {
    @Override
    public void run() {
        try {
            Thread.sleep(5000);
            System.out.println("Target thread completed normally");
        } catch(final InterruptedException ie) {
            System.out.println("Target thread was interrupted");
        }
    }
};

targetThread.start();
targetThread.interrupt();
于 2013-06-07T11:53:11.383 回答