在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()
方法唤醒等待的线程。在实际应用中,你可能需要根据具体需求调整代码。