生产消费模型的由来以及定义:
生产消费者模型是程序设计当中一种非常常见的设计模式,被广泛应用于消息队列以及其他的一些场景当中,,生产消费模型其中包括三者(生产者,消费者,仓库) 顾名思义 生产者为仓库不断生产添加货品,而消费者为仓库不断消耗和减少货品。但是考虑下面出现的两种情况 1.生产者一直生产为仓库添加商品,而消费者购买力 消费力不足 这样就会造成大量的浪费 出现产能过剩 2.消费者消费能力过强,而生产者生产能力跟不上,造成手忙脚乱,供不应求。 于是在其中就需要一个中间商来通知消费者和生产者 对两者之间进行一个调度,于是便有了生产消费者模型。
如下图所示(仓库为空的时候 消费者进入wait notify生产者进行,反之仓库满了的时候,生产者进入wait 消费者进入notify唤醒运行)
![](https://img-blog.csdnimg.cn/7b84320d797b46c7bb4b39328da35816.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA572R5Y-L5bCP5rWp,size_20,color_FFFFFF,t_70,g_se,x_16)
1.对仓库类别进行一个定义,设置一个最大值 以及当前物品数量的记录,当
![](https://img-blog.csdnimg.cn/ef62278d79a74166858c0588ce3c532e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA572R5Y-L5bCP5rWp,size_20,color_FFFFFF,t_70,g_se,x_16)
2.对消费者进行定义(消费者的线程类)
![](https://img-blog.csdnimg.cn/f67dcb6081ac4a4cb7aeb51e9d774d00.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA572R5Y-L5bCP5rWp,size_20,color_FFFFFF,t_70,g_se,x_16)
3.对生产者进行定义(生产者线程类别)
![](https://img-blog.csdnimg.cn/4070666d78fa41fcac363494fbd5348d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA572R5Y-L5bCP5rWp,size_20,color_FFFFFF,t_70,g_se,x_16)
4.期间生产者调用add方法为仓库添加 消费者调用remove方法进行消耗(synchronized保障线程的安全)
![](https://img-blog.csdnimg.cn/db75b517678c4daaab931fa5effd08ba.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA572R5Y-L5bCP5rWp,size_20,color_FFFFFF,t_70,g_se,x_16)
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();
}
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)