管程法解决生产者消费者问题
生产者-消费者模式是一个十分经典的多线程并发协作的模式,弄懂生产者-消费者问题能够让我们对并发编程的理解加深。所谓生产者-消费者问题,实际上主要是包含了两类线程,一种是生产者线程用于生产数据,另一种是消费者线程用于消费数据,为了解耦生产者和消费者的关系,通常会采用共享的数据区域,就像是一个仓库,生产者生产数据之后直接放置在共享数据区中,并不需要关心消费者的行为;而消费者只需要从共享数据区中去获取数据,就不再需要关心生产者的行为。但是,这个共享数据区域中应该具备这样的线程间并发协作的功能:
- 如果共享数据区已满的话,阻塞生产者继续生产数据放置入内;
- 如果共享数据区为空的话,阻塞消费者继续消费数据;
在实现生产者消费者问题时,可以采用三种方式:
1.使用Object的wait/notify的消息通知机制;
2.使用Lock的Condition的await/signal的消息通知机制;
3.使用BlockingQueue实现。
本篇使用第一种方法解决问题
/*** Description:生产者和消费者问题* Author:Jizaichun Date:2022/4/30 15:03*/
// 测试:生产者消费者模型--->利用缓冲区解决:管程法
public class TestPC {public static void main(String[] args) {SynContainer container = new SynContainer();new Productor(container).start();new Consumer(container).start();}
}// 生产者
class Productor extends Thread {SynContainer container;public Productor(SynContainer container) {this.container = container;}// 生产@Overridepublic void run() {for (int i = 0; i < 100; i++) {container.push(new Merchandise(i));System.out.println("生产了" + i + "个商品");}}
}// 消费者
class Consumer extends Thread {SynContainer container;public Consumer(SynContainer container) {this.container = container;}@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println("消费了-->" + container.pop().id + "个商品");}}
}// 产品
class Merchandise {int id;//产品编号public Merchandise(int id) {this.id = id;}
}// 缓冲区
class SynContainer {// 需要一个容器大小Merchandise[] merchandises = new Merchandise[10];// 容器计数器int count = 0;// 生产者放入产品public synchronized void push(Merchandise merchandise) {// 如果容器满了,就需要等待消费者消费if (count == merchandises.length) {// 通知消费者消费,生产等待try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}// 如果没有满,我们就需要丢入产品merchandises[count] = merchandise;count++;// 可以通知消费者消费了this.notifyAll();}// 消费者消费产品public synchronized Merchandise pop() {// 判断能否消费if (count == 0) {// 等待生产者,消费者等待try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}// 如果可以消费count--;Merchandise merchandise = merchandises[count];// 吃完了,通知生产者生产this.notifyAll();return merchandise;}
}
管程法解决生产者消费者问题相关推荐
- 使用管程法解决生产者消费者问题
package com.test.Thread; /* 测试生产者消费者模型-->利用缓冲区解决:管程法 生产者,消费者,产品,缓冲区*/ public class TestPC {public ...
- 操作系统课设--使用信号量解决生产者/消费者同步问题
山东大学操作系统课设lab3 实验三 使用信号量解决生产者/消费者同步问题(lab3) 实验目的 理解Nachos的信号量是如何实现的 生产者/消费者问题是如何用信号量实现的 在Nachos中是如何创 ...
- Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题
前面的一片文章我们已经讲过使用信号量解决生产者消费者问题.那么什么情况下我们须要引入条件变量呢? 这里借用 http://www.cnblogs.com/ngnetboy/p/3521547.htm ...
- 两种方式解决 生产者消费者问题
一.通过wait().notify()线程通信来实现 输出结果: 二.通过阻塞队列来解决生产者消费者问题 输出结果: 由输出结果可以看出:"最后阻塞队列中还剩下4个鸡蛋"明显是正确 ...
- JAVA解决生产消费者_Java常用三种方式解决生产者消费者问题(详细)
package test; /** * Synchronized 版本解决生产者消费者 * wait() / notify()方法 */ import java.util.LinkedList; im ...
- 用 wait-notify 写一段代码来解决生产者-消费者问题
用 wait-notify 写一段代码来解决生产者-消费者问题 参考文章: (1)用 wait-notify 写一段代码来解决生产者-消费者问题 (2)https://www.cnblogs.com/ ...
- 管程法实现生产者消费者问题
//管程法实现生产者消费者 //生产者,消费者,产品,缓冲区 public class TestPC {public static void main(String[] args) {SynConta ...
- java信号量生产者_java信号量PV操作 解决生产者-消费者问题
package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...
- 使用信号量机制解决生产者消费者问题
生产者消费者问题是经典的同步问题,这篇文章用来记录一下如何使用信号量机制解决. 信号量机制(Semaphore)是解决同步问题常用解法,所谓信号量其实就代表着对应共享资源的数量.对于信号量只允许三种操 ...
最新文章
- JQuery Easy Ui 可装载组合框 - ComboBox
- oracle 11g数据库启动错误总结
- qpython怎么用matplotlib_将matplotlib绘图嵌入pyqt的方法示例
- python实现最小二乘法的线性回归_最小二乘法求线性回归的python实现
- 自动让钱生钱方法100%安全稳定
- 漂亮的html页面源码_爬虫数据分析之html
- 人工智能系统研究的9大挑战和4大趋势
- XTU 1252 Defense Tower
- MTK 驱动开发(17)---LCD MIPI
- 浅谈App-V(附:参考资料)
- vue:无法将“vue”识别为脚本_Vue3将带来巨大的性能提升
- 读取文本作为输出字段
- centos配置epel和remi源
- 小猫钓鱼纸牌游戏java_小猫钓鱼游戏-关于扑克牌的游戏规则请问小猫钓鱼这种玩法的 – 手机爱问...
- scratch编程我的世界3D史蒂夫
- JS 实现点击按钮实现超链接功能
- amCharts 5.2.31 Crack
- golang简介_Golang简介
- mysql图形查询操作 点找面及面找点 Polygon获取中心点坐标 空间地理位置计算
- 计算机黑屏的原因及解决办法,电脑黑屏的原因及排除方法大全