在哪里使用synchronized块捕获Object.wait()的InterruptedException?

Nik*_*sov 5 java multithreading notify interrupted-exception

据我所知,这是Java中多线程的非常常见的片段.

boolean loaded = false;
Object lock = new Object();

public void block() {
    synchronized (lock) {
        while(!loaded)
            lock.wait(); // Unhandled exception type InterruptedException
    }
}
Run Code Online (Sandbox Code Playgroud)

在另一个线程中

public void done () {
    synchronized (lock) {
        loaded = true;
        lock.notify();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我不知道应该把它放在哪里尝试和捕获,我可以围绕整个同步块或只是lock.wait()?什么是经验法则,它真的重要吗?

处理是否可以Thread.currentThread().interrupt()在这种情况下打电话?

And*_*nov 6

您可能想要考虑Brian Goetz撰写的文章:Java理论与实践:处理InterruptedException

一般情况下,如果您不知道该怎么做,那么除了让调用者代码知道在等待锁定时可以中断此方法时,不要做任何事情.您可以通过将InterruptedException抛出到方法签名来执行此操作.

如果由于某种原因你被迫添加一个try/catch块并处理异常,那么Thread.currentThread().interrupt()会做,但重新抛出它可能是合适的.