什么是生产者/消费者模式

生产者消费者模型具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品。
具体来说就是:

  • 生产者生产数据到缓冲区中,消费者从缓冲区中取数据。
  • 如果缓冲区已经满了,则生产者线程阻塞。
  • 如果缓冲区为空,那么消费者线程阻塞。

管程法(利用缓冲区)

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 Chicken(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 Chicken{int id;//产品编号public Chicken(int id) {this.id = id;}
}//缓冲区
class SynContainer{//需要一个容器大小Chicken[] chickens = new Chicken[10];//容器计数器int count = 0;//生产者放入产品public synchronized void push(Chicken chicken)  {//如果容器满了就需要等待消费if (count == chickens.length){//通知消费者消费,生产者等待try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}//如果没有满就需要丢入产品chickens[count] = chicken;count++;//可以通知消费者消费this.notifyAll();}//消费者消费产品public synchronized Chicken pop() {//判断能否消费if (count == 0){//等待生产者生产,消费者等待try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}//如果可以消费count--;Chicken chicken = chickens[count];//吃完了通知生产者生产this.notifyAll();return chicken;}}

信号灯法(利用标志位)

public class TestPc2 {public static void main(String[] args) {TV tv = new TV();new Player(tv).start();new Watcher(tv).start();}
}//生产者-->演员
class Player extends Thread{TV tv;public Player(TV tv){this.tv = tv;}@Overridepublic void run() {for (int i = 0; i < 20; i++) {if (i%2==0){this.tv.play("快乐大本营播放");}else {this.tv.play("抖音记录美好生活");}}}
}
//消费者-->观众
class Watcher extends Thread{TV tv;public Watcher(TV tv){this.tv = tv;}@Overridepublic void run() {for (int i = 0; i < 20; i++) {tv.watch();}}
}
//产品-->节目
class TV{//演员表演,观众等待//观众观看,演员等待String voice;//表演的节目boolean flag = true;//表演public synchronized void play(String voice){if (!flag){try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("演员表演了: "+voice);//通知观众观看this.notifyAll();this.voice = voice;this.flag = !this.flag;}//观看public synchronized void watch(){if (flag){try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("观看了:"+voice);//通知演员表演this.notifyAll();this.flag = !this.flag;}
}

Java多线程:解决生产者/消费者模式相关推荐

  1. 【java并发系列】java多线程实现生产者消费者模式

    大家好,我是walker 一个从文科自学转行的程序员~ 爱好编程,偶尔写写编程文章和生活 欢迎关注公众号[I am Walker],回复"电子书",就可以获得200多本编程相关电子 ...

  2. Java线程实现生产者—消费者模式

    在这里插入代码片# Java 线程实现生产者-消费者模式 ##思路:实现类似消费者生产者线程之间通讯的功能,每创建一个工人,就让这个工人干活,干一段时间,工人自动消失,然后又去创建一个工人干活: 代码 ...

  3. java consumed_Java设计模式—生产者消费者模式(阻塞队列实现)

    生产者消费者模式是并发.多线程编程中经典的 真实世界中的生产者消费者模式 生产者和消费者模式在生活当中随处可见,它描述的是协调与协作的关系.比如一个人正在准备食物(生产者),而另一个人正在吃(消费者) ...

  4. Java多线程:生产者消费者模型

    文章目录 1.生产者消费者 1.1 生产者和消费者模式概述 1.2 经典案例:生产者和消费者 1.2.1 Object类的等待和唤醒方法 1.2.2 代码实现 1.3 生产者和消费者案例优化 1.3. ...

  5. 【多线程】--生产者消费者模式--synchronized版本

    在实现生产者消费者模式之前,我们先了解一下线程的5种状态:被创建.运行.冻结.消亡.阻塞,如下图: 在Jdk1.5发布之前,我们实现生产者消费者模式一般使用synchronized + while循环 ...

  6. Python多线程实现生产者消费者模式

    什么是生产者消费者模式 在软件开发的过程中,经常碰到这样的场景: 某些模块负责生产数据,这些数据由其他模块来负责处理(此处的模块可能是:函数.线程.进程等).产生数据的模块称为生产者,而处理数据的模块 ...

  7. Java线程实现生产者消费者模式

    1 什么是生产者消费者模式 想一个现实生活中的例子,啤酒商---超市---消费者也就是我们,啤酒商生产了啤酒,然后将啤酒销售给了超市,我们消费之又会到超市将啤酒买回来自己喝,那么啤酒商和消费者之间是什 ...

  8. Java 并发(生产者/消费者 模式)

    >生产者/消费者 模式角色:生产者,消费者都是线程,两者中间是容器,容器内部是产品. 要求: 容器 里面要定义容量 容器 往里面添加(满时等待) 或者 从里面删除(空时等待) ,都要是阻塞的(等 ...

  9. Java多线程编程——生产者消费者问题

    一.问题介绍 生产者消费者问题是一个经典的多线程同步问题.该问题描述了两个进程--即所谓的"生产者"和"消费者"--在实际运行时会发生的问题.生产者的主要作用是 ...

最新文章

  1. 全球CMOS图像传感器厂商最新排名:黑马杀出
  2. Android wear
  3. python 生成数组1:1:20_英特尔“演化算法”新框架:29个Python代码块,自动生成新算法...
  4. spark 2.x ML概念与应用
  5. 前端学习(1295):第三方模块npm
  6. php 调用 com,PHP调用COM函数
  7. 基于消息队列 RocketMQ 的大型分布式应用上云实践
  8. java演练 数组的逆序文字玩法 你是猪才怪
  9. 两个fetion飞信API
  10. 2021 年高教社杯全国大学生数学建模竞赛题目(E 题 中药材的鉴别)
  11. 复制含有随机指针节点的链表
  12. css文本样式(一):css字体样式
  13. 方钢管弹性模量计算方式_弹性模量计算公式.doc
  14. 深度ip转换器手机版app_手机防爆卫士app下载-手机防爆卫士去广告版1.2.0旧版
  15. 计算机制图视频教程,机械制图视频教程
  16. editplus自动换行html,EditPlus如何自动换行
  17. 转载:技术大停滞——范式春梦中的地球工业文明5:台阶前的坑:人类社会的宿命
  18. 程序员网站运营手册1
  19. GTK、GDK、GLIB三者的关系 - 阿堂的专栏 - 博客频道 - CSDN.NET
  20. 康考迪亚大学应用计算机科学,康考迪亚大学.pdf

热门文章

  1. python-模块的操作-安装-导入-使用
  2. laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
  3. 关于获取oracle中数据变更的时间戳的探索(待更新)
  4. Nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分...
  5. 基础知识 + 面试题目 总结 索引页
  6. 手机APP和WAP版的区别
  7. GIT上fork的项目获取最新源代码
  8. iptables之NAT
  9. Web前端 HTML 优化启动性能
  10. 同一域名下部署多个vue项目