在Java中,wait()
方法是Object
类的一个方法,主要用于让当前线程等待,直到其他线程调用同一个对象的notify()
或notifyAll()
方法。wait()
方法通常与synchronized
关键字和Lock
接口一起使用,以确保线程安全。
以下是使用wait()
方法时需要满足的条件:
-
线程必须是对象的所有者或者拥有对象的监视器(monitor)。这意味着,只有当一个线程获得了对象的锁(通过
synchronized
关键字或Lock
接口),它才能调用wait()
方法。 -
调用
wait()
方法时,线程必须进入阻塞状态。当线程调用wait()
方法时,它会释放对象的锁,并进入等待状态。其他线程可以通过调用notify()
或notifyAll()
方法唤醒等待的线程。 -
在调用
wait()
方法之前,线程需要使用synchronized
关键字或Lock
接口获取对象的锁。否则,将抛出IllegalMonitorStateException
异常。 -
为了避免虚假唤醒(spurious wakeup),通常需要在
while
循环中检查某个条件是否满足,然后再调用wait()
方法。这样可以确保线程在收到通知后,确实需要执行某些操作。
以下是一个简单的示例,展示了如何使用wait()
、notify()
和synchronized
关键字:
public class Example { private boolean condition = false; public synchronized void waitForCondition() throws InterruptedException { while (!condition) { wait(); } // 执行某些操作 } public synchronized void setCondition() { condition = true; notify(); } }
在这个示例中,waitForCondition()
方法使用synchronized
关键字确保只有获得锁的线程才能调用wait()
方法。setCondition()
方法在满足条件时调用notify()
,唤醒等待的线程。