在 Java 中,生产者-消费者模式是一种常见的同步多线程编程模式。在这个模式中,一个线程(生产者)负责生成数据,另一个线程(消费者)负责消费数据。数据在生产者和消费者之间通过一个缓存或队列进行传递。
下面是一种使用wait()
和notify()
方法实现的生产者-消费者模式:
class Buffer { private int data; private boolean isEmpty = true; public synchronized void produce(int newData) { while (!isEmpty) { try { wait(); } catch (InterruptedException e) {} } data = newData; isEmpty = false; notify(); } public synchronized int consume() { while (isEmpty) { try { wait(); } catch (InterruptedException e) {} } int result = data; isEmpty = true; notify(); return result; } } class Producer implements Runnable { private Buffer buffer; public Producer(Buffer buffer) { this.buffer = buffer; } public void run() { for (int i = 0; i< 10; i++) { buffer.produce(i); } } } class Consumer implements Runnable { private Buffer buffer; public Consumer(Buffer buffer) { this.buffer = buffer; } public void run() { for (int i = 0; i< 10; i++) { int data = buffer.consume(); System.out.println("Consumed " + data); } } } public class Main { public static void main(String[] args) { Buffer buffer = new Buffer(); Thread producerThread = new Thread(new Producer(buffer)); Thread consumerThread = new Thread(new Consumer(buffer)); producerThread.start(); consumerThread.start(); } }
在这个实现中,生产者和消费者共享一个Buffer
对象。当生产者调用produce
方法时,如果缓冲区非空,生产者线程进入等待状态,直到缓冲区为空。当生产者放置数据并更新缓冲区状态后,它使用notify
方法通知消费者线程。消费者线程在消费数据时采取类似的行动。