📜  java wait(timeout) - Java (1)

📅  最后修改于: 2023-12-03 15:15:58.190000             🧑  作者: Mango

Java wait(timeout)

简介

wait(timeout)java.lang.Object 类中的一个方法。该方法可用于协同多个线程之间的交互,以实现线程间的同步。

在使用 wait() 方法时,线程会释放它所拥有的监视器锁(monitor lock),之后进入等待状态(waiting state)。当其它线程调用该对象的 notify()notifyAll() 方法时,该线程将被唤醒并重新竞争该对象的监视器锁。

wait() 不同,wait(timeout) 方法可设置等待时间,即等待到一定时间后如果没有被唤醒,该线程将自动醒来并继续执行后续逻辑。

语法

public final void wait(long timeout) throws InterruptedException

  • 参数:timeout - 最长等待时间(以毫秒为单位)
  • 抛出异常: 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) 方法在等待期间应该被中断的时候进行条件测试(比如说,一个标志位是否被设置),以免无限等待。