在Java中,wait()
方法是Object
类的一个方法,用于让当前线程等待,直到其他线程调用该对象的notify()
或notifyAll()
方法。在使用wait()
方法时,需要注意以下几点:
- 必须在同步代码块或同步方法中使用
wait()
。这是因为wait()
方法会释放对象的锁,如果没有同步代码块或同步方法,其他线程可能会在wait()
执行期间获取到锁并执行,从而导致死锁。
synchronized (lock) { try { lock.wait(); } catch (InterruptedException e) { // 处理异常 } }
wait()
方法必须在while
循环中使用。这是因为wait()
方法可能会被意外唤醒(例如,由于线程调度),所以需要检查等待的条件是否仍然满足。如果条件不满足,应该继续等待。
synchronized (lock) { while (!condition) { try { lock.wait(); } catch (InterruptedException e) { // 处理异常 } } }
-
在调用
wait()
方法之前,需要获取对象的锁。否则,会抛出IllegalMonitorStateException
异常。 -
wait()
方法可能会抛出InterruptedException
异常,因此需要在方法签名中声明该异常,并在捕获异常后进行处理。 -
通常与
wait()
方法一起使用的还有notify()
和notifyAll()
方法。这两个方法用于唤醒等待的线程。在使用这些方法时,需要注意避免虚假唤醒(spurious wakeup),即线程可能会在没有收到通知的情况下被唤醒。为了处理这种情况,通常在while
循环中检查等待的条件是否满足。 -
notify()
方法只唤醒一个等待的线程,而notifyAll()
方法会唤醒所有等待的线程。根据实际需求选择合适的方法。 -
在某些情况下,可能需要使用
Object.wait(long timeout)
方法来设置等待的超时时间。这可以避免线程无限期地等待。