更新时间:2023-08-16 来源:黑马程序员 浏览量:
生产者-消费者问题是一个经典的并发编程问题,涉及到多个线程共享资源的同步与互斥。使用Java的wait和notify机制可以有效地解决这个问题。
接下来笔者就用具体的Java代码实现的简单生产者-消费者问题解决方案:
import java.util.LinkedList; class SharedResource { private LinkedList<Integer> buffer = new LinkedList<>(); private int capacity = 5; public synchronized void produce() throws InterruptedException { while (buffer.size() == capacity) { wait(); // 等待,直到缓冲区不满 } int item = (int) (Math.random() * 100); buffer.add(item); System.out.println("Produced: " + item); notifyAll(); // 唤醒等待的消费者线程 } public synchronized void consume() throws InterruptedException { while (buffer.size() == 0) { wait(); // 等待,直到缓冲区不空 } int item = buffer.removeFirst(); System.out.println("Consumed: " + item); notifyAll(); // 唤醒等待的生产者线程 } } class Producer implements Runnable { private SharedResource sharedResource; public Producer(SharedResource sharedResource) { this.sharedResource = sharedResource; } @Override public void run() { try { while (true) { sharedResource.produce(); Thread.sleep(1000); // 模拟生产时间 } } catch (InterruptedException e) { e.printStackTrace(); } } } class Consumer implements Runnable { private SharedResource sharedResource; public Consumer(SharedResource sharedResource) { this.sharedResource = sharedResource; } @Override public void run() { try { while (true) { sharedResource.consume(); Thread.sleep(1500); // 模拟消费时间 } } catch (InterruptedException e) { e.printStackTrace(); } } } public class Main { public static void main(String[] args) { SharedResource sharedResource = new SharedResource(); Thread producerThread = new Thread(new Producer(sharedResource)); Thread consumerThread = new Thread(new Consumer(sharedResource)); producerThread.start(); consumerThread.start(); } }
在这个例子中,SharedResource类表示共享的缓冲区,其中的produce和consume方法分别用于生产和消费数据。Producer和Consumer类分别表示生产者和消费者线程,它们通过调用SharedResource的方法来生产和消费数据。使用wait和notifyAll方法来实现线程之间的同步与互斥,确保在正确的时机唤醒等待的线程。
需要注意的是,这只是一个简单的示例,实际生产环境中可能需要更复杂的逻辑和错误处理。同时,Java 5及之后的版本提供了更高级的并发工具,如BlockingQueue和ExecutorService,可以更方便地解决生产者-消费者问题。