📅  最后修改于: 2023-12-03 15:15:58.190000             🧑  作者: Mango
wait(timeout)
是 java.lang.Object
类中的一个方法。该方法可用于协同多个线程之间的交互,以实现线程间的同步。
在使用 wait()
方法时,线程会释放它所拥有的监视器锁(monitor lock),之后进入等待状态(waiting state)。当其它线程调用该对象的 notify()
或 notifyAll()
方法时,该线程将被唤醒并重新竞争该对象的监视器锁。
与 wait()
不同,wait(timeout)
方法可设置等待时间,即等待到一定时间后如果没有被唤醒,该线程将自动醒来并继续执行后续逻辑。
public final void wait(long timeout) throws InterruptedException
synchronized(lockObject) {
while(conditionNotMet()) {
try {
lockObject.wait(5000); // 等待 5 秒钟
} catch (InterruptedException e) {
// 如果被中断,抛出异常
e.printstackTrace();
}
}
// 条件满足后执行逻辑
}
在上述示例中,synchronized
关键字表明该代码块中的对象(lockObject
)为监视器对象。 while
循环用于测试条件。当条件不满足时,线程调用 lockObject.wait(5000)
进入等待状态(并释放监视器锁)。在等待过程中,线程等待最多 5 秒钟或者被其他线程唤醒。若等待的时间超过 5 秒钟或者被中断,则该线程自动唤醒并抛出 InterruptedException
异常。若被唤醒且条件满足,则该线程会重新获得监视器锁并继续执行后续逻辑。
wait(timeout)
方法必须在 synchronized
块中使用,以获取监视器锁并释放它。wait(timeout)
方法应该总是与 while
循环一起使用以测试条件(不要用 if
),因为 notify()
方法可能会在等待后立即被调用并导致条件未满足。wait(timeout)
的参数应该设置为等待时间的最长确切时间。如果要无限等待,则应该调用 wait()
方法。wait(timeout)
方法在等待期间应该被中断的时候进行条件测试(比如说,一个标志位是否被设置),以免无限等待。