生产者-消费者模式是一个十分经典的多线程并发协作的模式,弄懂生产者-消费者问题能够让我们对并发编程的理解加深。所谓生产者-消费者问题,实际上主要是包含了两类线程,一种是生产者线程用于生产数据,另一种是消费者线程用于消费数据,为了解耦生产者和消费者的关系,通常会采用共享的数据区域,就像是一个仓库,生产者生产数据之后直接放置在共享数据区中,并不需要关心消费者的行为;而消费者只需要从共享数据区中去获取数据,就不再需要关心生产者的行为。但是,这个共享数据区域中应该具备这样的线程间并发协作的功能:

  1. 如果共享数据区已满的话,阻塞生产者继续生产数据放置入内;
  2. 如果共享数据区为空的话,阻塞消费者继续消费数据;

在实现生产者消费者问题时,可以采用三种方式:

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;}
}

管程法解决生产者消费者问题相关推荐

  1. 使用管程法解决生产者消费者问题

    package com.test.Thread; /* 测试生产者消费者模型-->利用缓冲区解决:管程法 生产者,消费者,产品,缓冲区*/ public class TestPC {public ...

  2. 操作系统课设--使用信号量解决生产者/消费者同步问题

    山东大学操作系统课设lab3 实验三 使用信号量解决生产者/消费者同步问题(lab3) 实验目的 理解Nachos的信号量是如何实现的 生产者/消费者问题是如何用信号量实现的 在Nachos中是如何创 ...

  3. Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题

    前面的一片文章我们已经讲过使用信号量解决生产者消费者问题.那么什么情况下我们须要引入条件变量呢? 这里借用  http://www.cnblogs.com/ngnetboy/p/3521547.htm ...

  4. 两种方式解决 生产者消费者问题

    一.通过wait().notify()线程通信来实现 输出结果: 二.通过阻塞队列来解决生产者消费者问题 输出结果: 由输出结果可以看出:"最后阻塞队列中还剩下4个鸡蛋"明显是正确 ...

  5. JAVA解决生产消费者_Java常用三种方式解决生产者消费者问题(详细)

    package test; /** * Synchronized 版本解决生产者消费者 * wait() / notify()方法 */ import java.util.LinkedList; im ...

  6. 用 wait-notify 写一段代码来解决生产者-消费者问题

    用 wait-notify 写一段代码来解决生产者-消费者问题 参考文章: (1)用 wait-notify 写一段代码来解决生产者-消费者问题 (2)https://www.cnblogs.com/ ...

  7. 管程法实现生产者消费者问题

    //管程法实现生产者消费者 //生产者,消费者,产品,缓冲区 public class TestPC {public static void main(String[] args) {SynConta ...

  8. java信号量生产者_java信号量PV操作 解决生产者-消费者问题

    package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...

  9. 使用信号量机制解决生产者消费者问题

    生产者消费者问题是经典的同步问题,这篇文章用来记录一下如何使用信号量机制解决. 信号量机制(Semaphore)是解决同步问题常用解法,所谓信号量其实就代表着对应共享资源的数量.对于信号量只允许三种操 ...

最新文章

  1. JQuery Easy Ui 可装载组合框 - ComboBox
  2. oracle 11g数据库启动错误总结
  3. qpython怎么用matplotlib_将matplotlib绘图嵌入pyqt的方法示例
  4. python实现最小二乘法的线性回归_最小二乘法求线性回归的python实现
  5. 自动让钱生钱方法100%安全稳定
  6. 漂亮的html页面源码_爬虫数据分析之html
  7. 人工智能系统研究的9大挑战和4大趋势
  8. XTU 1252 Defense Tower
  9. MTK 驱动开发(17)---LCD MIPI
  10. 浅谈App-V(附:参考资料)
  11. vue:无法将“vue”识别为脚本_Vue3将带来巨大的性能提升
  12. 读取文本作为输出字段
  13. centos配置epel和remi源
  14. 小猫钓鱼纸牌游戏java_小猫钓鱼游戏-关于扑克牌的游戏规则请问小猫钓鱼这种玩法的 – 手机爱问...
  15. scratch编程我的世界3D史蒂夫
  16. JS 实现点击按钮实现超链接功能
  17. amCharts 5.2.31 Crack
  18. golang简介_Golang简介
  19. mysql图形查询操作 点找面及面找点 Polygon获取中心点坐标 空间地理位置计算
  20. 计算机黑屏的原因及解决办法,电脑黑屏的原因及排除方法大全

热门文章

  1. 李沐笔记(softmax回归)
  2. 苹果考虑推迟发布5G iPhone
  3. 省公司交流期间一线工作总结
  4. 终极单词index 排序 K-L
  5. python从属关系编号_42:对象、类、以及从属关系
  6. 【白嫖系列】教育邮箱申请最新专业绘图软件OriginPro(官方渠道)
  7. 学习使用html2canvas生成渐变色背景图片
  8. 基于stm32f407的无线视屏传输项目
  9. Android 服务动态发现 SPA 之 Auto Service
  10. 板内盘中孔设计狂飙,细密间距线路中招