为什么将 Thread.currentThread().isInterrupted() 与 try/catch 一起使用

Wei*_*Sun 5 java multithreading

我发现这种结构在Thinking in java的多线程章节中很流行:

public void run(){
    try{
        while(!Thread.currentThread().isInterrupted()){
            // do something blocked like wait(), sleep() or I/O
        }
    }catch(InterruptedExeption e){

    }
}
Run Code Online (Sandbox Code Playgroud)

但是我现在认为 while 循环当且仅当被阻塞或抛出时才会退出wait(),为什么sleep()不使用呢?或者只是因为它是规范的?I/OInterruptedExeptionwhile(true)Thread.currentThread().isInterrupted()

Nat*_*hes 3

就其本身而言,检查中断是不必要的,因为 Runnable 所做的只是睡眠。但正如您从评论中可以看出的那样,这是为了作为更大例程的模型。当 sleep 和 wait 抛出 InterruptedException 时,阻塞 I/O 调用(在注释中列出)不会,并且不等待或 sleep 的 CPU 密集型代码也不会。

Bruce E 在这里所做的是提供一个模板供您遵循,该模板既处理抛出 InterruptedException 的情况(他使用它退出循环),又处理不涉及睡眠或等待且不存在 InterruptedException 的情况。抛出。它让读者知道他们可以选择显式检查标志,并演示执行此操作的正确方法(而不是使用会清除标志的中断方法)。