简述如何调用 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
,这是因为线程可能在等待过程中被其他线程中断。