温馨提示×

java wait()方法如何进行条件等待

小樊
83
2024-12-06 03:27:55
栏目: 编程语言

在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();
    }
}

在这个示例中,我们有两个线程:t1t2。线程t1lock对象上等待条件满足,而线程t2在3秒后将条件设置为满足并唤醒等待的线程。

  1. 线程t1进入synchronized块,并调用lock.wait()方法进入等待状态。此时,线程t1会释放lock对象的锁,允许其他线程(如线程t2)获取锁并执行同步代码块。
  2. 线程t2获取lock对象的锁,然后休眠3秒。
  3. 线程t2将条件设置为满足(condition = true),然后调用lock.notify()方法唤醒等待的线程(线程t1)。
  4. 线程t1被唤醒后,重新尝试获取lock对象的锁。由于锁已被线程t2持有,线程t1将继续等待,直到线程t2释放锁。
  5. 当线程t2释放锁后,线程t1获取锁并继续执行,输出"Thread 1: Condition met!"。

这个示例展示了如何使用wait()方法进行条件等待以及如何使用notify()方法唤醒等待的线程。在实际应用中,你可能需要根据具体需求调整代码。

0