Java线程通信:wait()、notify()和notifyAll()方法详解
Java Object类中的wait()、notify()和notifyAll()方法是实现线程间通信的关键工具。它们允许线程在等待特定条件满足时进入等待状态,并在条件满足后被唤醒。
-
wait()方法:当一个线程调用wait()方法时,它会进入等待状态,并释放当前持有的锁。线程只有在另一个线程调用notify()或notifyAll()方法唤醒它,或者等待时间超时后才会继续执行。wait()方法通常与synchronized关键字一起使用,以确保线程在等待期间不会被其他线程干扰。
-
notify()方法:notify()方法唤醒一个正在等待当前对象的线程。如果有多个线程正在等待,则只会唤醒其中一个线程。notify()方法也必须在synchronized块中使用,以确保只有一个线程能够获取锁并继续执行。
-
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,然后唤醒生产者线程。这个过程不断循环,实现了生产者和消费者之间的同步。
原文地址: https://www.cveoy.top/t/topic/oPW3 著作权归作者所有。请勿转载和采集!