在Java中,wait()
方法通常与synchronized
关键字和Object
类的notify()
或notifyAll()
方法一起使用,以实现线程间的条件等待和通知。以下是一个简单的示例,说明如何使用wait()
方法进行条件等待:
public class ConditionWaitExample {
private static final Object lock = new Object();
private static boolean condition = false;
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
synchronized (lock) {
System.out.println("Thread 1: Waiting for the condition...");
try {
lock.wait(); // 线程1在此处等待条件满足
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 1: Condition met!");
}
});
Thread t2 = new Thread(() -> {
synchronized (lock) {
try {
Thread.sleep(3000); // 线程2等待3秒
} catch (InterruptedException e) {
e.printStackTrace();
}
condition = true; // 设置条件满足
System.out.println("Thread 2: Setting the condition to true.");
lock.notify(); // 唤醒等待的线程(线程1)
}
});
t1.start();
t2.start();
}
}
在这个示例中,我们有两个线程:t1
和t2
。线程t1
在lock
对象上等待条件满足,而线程t2
在3秒后将条件设置为满足并唤醒等待的线程。
t1
进入synchronized
块,并调用lock.wait()
方法进入等待状态。此时,线程t1
会释放lock
对象的锁,允许其他线程(如线程t2
)获取锁并执行同步代码块。t2
获取lock
对象的锁,然后休眠3秒。t2
将条件设置为满足(condition = true
),然后调用lock.notify()
方法唤醒等待的线程(线程t1
)。t1
被唤醒后,重新尝试获取lock
对象的锁。由于锁已被线程t2
持有,线程t1
将继续等待,直到线程t2
释放锁。t2
释放锁后,线程t1
获取锁并继续执行,输出"Thread 1: Condition met!"。这个示例展示了如何使用wait()
方法进行条件等待以及如何使用notify()
方法唤醒等待的线程。在实际应用中,你可能需要根据具体需求调整代码。