Java Object类中的wait()、notify()和notifyAll()方法是实现线程间通信的关键工具。它们允许线程在等待特定条件满足时进入等待状态,并在条件满足后被唤醒。

  1. wait()方法:当一个线程调用wait()方法时,它会进入等待状态,并释放当前持有的锁。线程只有在另一个线程调用notify()或notifyAll()方法唤醒它,或者等待时间超时后才会继续执行。wait()方法通常与synchronized关键字一起使用,以确保线程在等待期间不会被其他线程干扰。

  2. notify()方法:notify()方法唤醒一个正在等待当前对象的线程。如果有多个线程正在等待,则只会唤醒其中一个线程。notify()方法也必须在synchronized块中使用,以确保只有一个线程能够获取锁并继续执行。

  3. notifyAll()方法:notifyAll()方法唤醒所有正在等待当前对象的线程。与notify()方法不同,notifyAll()会唤醒所有等待线程,但只有一个线程能够获取锁并继续执行。类似于notify(),notifyAll()方法也必须在synchronized块中使用。

总而言之,wait()、notify()和notifyAll()方法是线程间协作的强大工具。它们允许线程在等待特定条件满足时进入等待状态,并在条件满足后被唤醒,从而实现线程间的数据共享和同步。

示例:

public class ThreadCommunicationExample {
    private Object lock = new Object();
    private boolean flag = false;

    public void producer() {
        synchronized (lock) {
            while (!flag) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("Producer: Data is available");
            flag = false;
            lock.notify();
        }
    }

    public void consumer() {
        synchronized (lock) {
            while (flag) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("Consumer: Consuming data");
            flag = true;
            lock.notify();
        }
    }

    public static void main(String[] args) {
        ThreadCommunicationExample example = new ThreadCommunicationExample();
        Thread producerThread = new Thread(example::producer, "Producer");
        Thread consumerThread = new Thread(example::consumer, "Consumer");
        producerThread.start();
        consumerThread.start();
    }
}

在这个示例中,生产者线程会生产数据并设置flag为true,然后唤醒消费者线程。消费者线程会消费数据并将flag设置为false,然后唤醒生产者线程。这个过程不断循环,实现了生产者和消费者之间的同步。

Java线程通信:wait()、notify()和notifyAll()方法详解

原文地址: https://www.cveoy.top/t/topic/oPW3 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录