引言
在多线程编程中,线程间通信是一个重要且复杂的主题。Java 提供了一套基本的机制来实现线程间通信,即使用 wait()
, notify()
, 和 notifyAll()
方法。这些方法由 Object
类提供,用于协调多个线程对共享资源的访问。本文将详细介绍这些方法的工作原理、使用场景以及一些实际示例。
基本概念
wait()
wait()
方法使当前线程进入等待状态,直到另一个线程调用 notify()
或 notifyAll()
方法唤醒它。调用 wait()
方法时,线程必须持有该对象的监视器锁(即必须在同步块或同步方法内调用 wait()
)。
notify()
notify()
方法唤醒在此对象监视器上等待的单个线程。如果有多个线程在等待,则其中一个线程将被唤醒,具体哪个线程被唤醒取决于线程调度器的实现。
notifyAll()
notifyAll()
方法唤醒在此对象监视器上等待的所有线程。这些线程将竞争重新获得该对象的监视器锁,并继续执行。
使用场景
生产者-消费者模式
生产者-消费者模式是多线程编程中的经典问题。在这个模式中,生产者线程生成数据并将其放入共享缓冲区,而消费者线程从缓冲区中取出数据进行处理。为了避免缓冲区溢出和空取,生产者和消费者需要协调工作。
示例代码
生产者-消费者实现
以下是一个使用 wait()
和 notify()
实现的简单生产者-消费者示例:
import java.util.LinkedList;
import java.util.Queue;
class ProducerConsumer {
private final Queue<Integer> queue = new LinkedList<>();
private final int MAX_SIZE = 10;
public void produce()