生产消费模型的由来以及定义:
生产消费者模型是程序设计当中一种非常常见的设计模式,被广泛应用于消息队列以及其他的一些场景当中,,生产消费模型其中包括三者(生产者,消费者,仓库) 顾名思义 生产者为仓库不断生产添加货品,而消费者为仓库不断消耗和减少货品。但是考虑下面出现的两种情况 1.生产者一直生产为仓库添加商品,而消费者购买力 消费力不足 这样就会造成大量的浪费 出现产能过剩 2.消费者消费能力过强,而生产者生产能力跟不上,造成手忙脚乱,供不应求。 于是在其中就需要一个中间商来通知消费者和生产者 对两者之间进行一个调度,于是便有了生产消费者模型。
如下图所示(仓库为空的时候 消费者进入wait notify生产者进行,反之仓库满了的时候,生产者进入wait 消费者进入notify唤醒运行)
1.对仓库类别进行一个定义,设置一个最大值 以及当前物品数量的记录,当
2.对消费者进行定义(消费者的线程类)
3.对生产者进行定义(生产者线程类别)
4.期间生产者调用add方法为仓库添加 消费者调用remove方法进行消耗(synchronized保障线程的安全)
5.部分源码如下
public static void main(String[] args) { Factory factory = new Factory(50); Producer producer = new Producer(factory); Producer producer2 = new Producer(factory); Consumer consumer = new Consumer(factory); new Thread(producer).start(); new Thread(producer2).start(); new Thread(consumer).start();
public synchronized void add(){ //如果工厂没有满,就生产物品 if (num < max){ num++; System.out.println("生产了一件商品,现在仓库中还有:" + num + "件物品"); //唤醒等待的消费者来消费 notifyAll(); }else { try { //工厂满了,生产者等待 System.out.println("仓库满了,生产者等待"); wait(); } catch (InterruptedException e) { e.printStackTrace(); } } }
public synchronized void remove(){ if (0 < num){ num--; System.out.println("消费了一件物品,还剩下:" + num + "件物品"); //唤醒等待的生产者来生产物品 notifyAll(); }else { try { //没有东西可以被消费了,该线程等待 System.out.println("仓库没货了"); wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } }