package de.bvb; /** * 生产者消费者模式 * 通过 wait() 和 notify() 通信方法实现 * */ public class Test1 { public static void main(String[] args) { Godown godown = new Godown(50); for (int i = 0; i < 5; i++) { new ProducerThread(i * 10, godown).start(); new ConsumerThread(i * 10, godown).start(); } } } /** 仓库 */ class Godown { public static final int max_size = 100; // 最大库存量 public int currentSize; // 当前库存 public Godown(int currentSize) { this.currentSize = currentSize; } // 生产指定数量的产品 public synchronized void produce(int size) { try { while (currentSize + size > max_size) { // 不满足生产的条件 System.out.println("要生产的产品数量" + size + "超过剩余库容量" + (max_size - currentSize) + ",暂时不能执行生产任务!"); // 当前的生产线程等待 wait(); } // 满足生产条件,则进行生产,这里简单的更改当前库存量 currentSize += size; System.out.println("生产前仓储量为:" + (currentSize - size) + ";生产了" + size + "个产品,现仓储量为" + currentSize); // 唤醒在此对象监视器上等待的所有线程 notifyAll(); } catch (Exception e) { e.printStackTrace(); } } // 消费指定数量的产品 public synchronized void consume(int size) { try { while (currentSize < size) { // 不满足消费的条件 System.out.println("要消费的产品数量" + size + "超过剩余库存量" + (currentSize) + ",暂时不能执行消费任务!"); // 当前的生产线程等待 wait(); } // 满足生产条件,则进行生产,这里简单的更改当前库存量 currentSize -= size; System.out.println("消费前的仓储量为" + (currentSize + size) + ";已经消费了" + size + "个产品,现仓储量为" + currentSize); // 唤醒在此对象监视器上等待的所有线程 notifyAll(); } catch (Exception e) { e.printStackTrace(); } } } /** 生产者线程 */ class ProducerThread extends Thread { private int size; private Godown godown; public ProducerThread(int size, Godown godown) { super(); this.size = size; this.godown = godown; } @Override public void run() { godown.produce(size); } } class ConsumerThread extends Thread { private int size; private Godown godown; public ConsumerThread(int size, Godown godown) { super(); this.size = size; this.godown = godown; } @Override public void run() { godown.consume(size); } }
时间: 2024-10-04 16:13:08