能否提供一个关于notify和wait方法在多线程同步中的具体实例,以及它们各自的作用是什么?
时间: 2024-12-02 08:16:12 浏览: 13
在多线程同步中,`notify()` 和 `wait()` 是 Java 中 `java.util.concurrent.locks.Condition` 接口提供的两个核心方法,用于线程间的协作。它们通常与 `Lock` 类或 `Semaphore` 等并发工具一起使用。
例如,假设有一个生产者-消费者模型,生产者线程需要将产品放入一个缓冲区,而消费者线程则从缓冲区取走产品。可以创建一个共享的 `BlockingQueue` 并用它作为信号:
```java
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class ProducerConsumer {
private final BlockingQueue<String> queue = new LinkedBlockingQueue<>();
private final Object lock = new Object();
public void producer(String product) {
synchronized (lock) {
// 生产产品并检查是否满
while (queue.isFull()) {
try {
lock.wait(); // 如果队列已满,生产者等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 生产并加入队列
queue.put(product);
System.out.println("Produced " + product);
lock.notify(); // 唤醒一个正在等待的消费者
}
}
public void consumer() {
synchronized (lock) {
// 消费者尝试获取产品并检查是否空
while (queue.isEmpty()) {
try {
lock.wait(); // 队列为空,消费者等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String product = queue.take(); // 获取并消费产品
System.out.println("Consumed " + product);
lock.notify(); // 唤醒其他等待的生产者或消费者
}
}
}
```
- `notify()`:当某个线程持有锁并且检测到满足特定条件时(比如生产者发现缓冲区不满),它会唤醒一个在此锁上等待的线程。
- `wait()`:持有锁的线程如果发现当前状态不符合继续运行的条件(如消费者等待缓冲区非空),会选择挂起自身,并释放锁,直到其他线程通过 `notify()` 或 `notifyAll()` 唤醒它。
阅读全文