跳到主要内容

简述如何调用 wait()方法的?使用 if 块还是循环?为什么?

参考答案:

wait() 方法是 Java 中 Object 类的一个方法,用于使当前线程等待,直到另一个线程调用该对象的 notify()notifyAll() 方法。调用 wait() 方法的线程必须拥有对象的监视器锁(也称为内部锁或同步锁),否则会抛出 IllegalMonitorStateException

调用 wait() 方法通常是在一个循环中,而不是在一个 if 块中。这是因为 wait() 方法可能会导致线程被唤醒,即使还没有满足等待的条件。如果只在 if 块中调用 wait(),那么线程可能会在条件尚未满足的情况下被唤醒,然后再次进入等待状态,这将导致线程无休止地等待。

因此,通常会将 wait() 调用放在一个循环中,如下所示:

synchronized (obj) {
    while (!condition) {
        try {
            obj.wait();
        } catch (InterruptedException e) {
            // 处理中断
        }
    }
    // 继续执行
}

在这个例子中,condition 是线程等待的条件。如果条件尚未满足,线程将调用 wait() 进入等待状态。当线程被唤醒时,它会再次检查条件是否满足。如果条件仍然不满足,线程将再次进入等待状态。只有当条件满足时,线程才会继续执行。

使用循环而不是 if 块的原因是,这样可以确保线程只会在条件满足时退出等待状态,从而避免无休止的等待。同时,还需要注意处理 InterruptedException,这是因为线程可能在等待过程中被其他线程中断。