Java多线程编程之生产者消费者模式的实现

需积分: 5 0 下载量 159 浏览量 更新于2024-10-21 收藏 1KB ZIP 举报
资源摘要信息:"Java中wait-notify机制实现生产者消费者模型" Java中的wait-notify机制是多线程编程中用于线程间通信的一种同步机制。生产者消费者问题是并发编程中的经典问题,用来描述在多线程环境下,如何通过共享资源的协调来避免数据不一致和资源浪费。 在生产者消费者模型中,通常存在两组线程:生产者和消费者。生产者负责生产数据并放入缓冲区,而消费者则从缓冲区中取出数据消费。为了避免生产者在缓冲区满时继续生产导致数据丢失,或者消费者在缓冲区空时尝试消费导致错误,需要使用同步机制控制生产者和消费者的行为。 使用wait-notify机制可以优雅地解决这个问题。具体实现步骤如下: 1. 定义共享资源的缓冲区,并创建一个监视对象(通常是共享资源对象本身)。 2. 生产者在生产数据前,检查缓冲区是否已满。如果已满,则生产者调用监视对象的wait()方法,进入等待状态。 3. 消费者在消费数据前,检查缓冲区是否为空。如果为空,则消费者调用监视对象的wait()方法,进入等待状态。 4. 当消费者消费数据后,若缓冲区不为空,则通过调用监视对象的notify()或notifyAll()方法唤醒其他等待中的线程(生产者线程)。 5. 同样地,生产者在生产数据后,若缓冲区不满,则通过调用监视对象的notify()或notifyAll()方法唤醒其他等待中的线程(消费者线程)。 6. 被唤醒的线程将从wait()方法返回继续执行,并重新检查条件。 下面是一个简单的Java代码示例,展示了如何使用wait-notify机制来实现生产者消费者模型: ```java public class Buffer { private int capacity; private int count; private int[] buffer; private int in = 0; private int out = 0; public Buffer(int capacity) { this.capacity = capacity; this.buffer = new int[capacity]; this.count = 0; } public synchronized void produce(int value) throws InterruptedException { while (count == capacity) { wait(); } buffer[in] = value; in = (in + 1) % capacity; count++; notifyAll(); } public synchronized int consume() throws InterruptedException { while (count == 0) { wait(); } int value = buffer[out]; out = (out + 1) % capacity; count--; notifyAll(); return value; } } public class Producer implements Runnable { private Buffer buffer; public Producer(Buffer buffer) { this.buffer = buffer; } public void run() { for (int i = 0; i < 10; i++) { try { buffer.produce(i); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } public class Consumer implements Runnable { private Buffer buffer; public Consumer(Buffer buffer) { this.buffer = buffer; } public void run() { for (int i = 0; i < 10; i++) { try { buffer.consume(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } // Main class to run the program public class Main { public static void main(String[] args) { Buffer buffer = new Buffer(5); Producer producer = new Producer(buffer); Consumer consumer = new Consumer(buffer); new Thread(producer).start(); new Thread(consumer).start(); } } ``` 在这个例子中,Buffer类定义了一个固定大小的缓冲区,以及生产者和消费者所需的方法。Producer和Consumer类分别实现了Runnable接口,以便可以在单独的线程中运行。在Main类中,创建了Buffer、Producer和Consumer的实例,并在一个新的线程中启动了生产者和消费者。 通过wait()方法,生产者和消费者线程能够在条件不满足时自动进入等待状态,并在适当的条件下被唤醒。这种方式确保了线程间的协调,避免了竞态条件和资源的不一致问题,是生产者消费者问题的经典解决方案。