Java多线程:解决生产者/消费者模式
什么是生产者/消费者模式
生产者消费者模型具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品。
具体来说就是:
- 生产者生产数据到缓冲区中,消费者从缓冲区中取数据。
- 如果缓冲区已经满了,则生产者线程阻塞。
- 如果缓冲区为空,那么消费者线程阻塞。
管程法(利用缓冲区)
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多线程:解决生产者/消费者模式相关推荐
- 【java并发系列】java多线程实现生产者消费者模式
大家好,我是walker 一个从文科自学转行的程序员~ 爱好编程,偶尔写写编程文章和生活 欢迎关注公众号[I am Walker],回复"电子书",就可以获得200多本编程相关电子 ...
- Java线程实现生产者—消费者模式
在这里插入代码片# Java 线程实现生产者-消费者模式 ##思路:实现类似消费者生产者线程之间通讯的功能,每创建一个工人,就让这个工人干活,干一段时间,工人自动消失,然后又去创建一个工人干活: 代码 ...
- java consumed_Java设计模式—生产者消费者模式(阻塞队列实现)
生产者消费者模式是并发.多线程编程中经典的 真实世界中的生产者消费者模式 生产者和消费者模式在生活当中随处可见,它描述的是协调与协作的关系.比如一个人正在准备食物(生产者),而另一个人正在吃(消费者) ...
- Java多线程:生产者消费者模型
文章目录 1.生产者消费者 1.1 生产者和消费者模式概述 1.2 经典案例:生产者和消费者 1.2.1 Object类的等待和唤醒方法 1.2.2 代码实现 1.3 生产者和消费者案例优化 1.3. ...
- 【多线程】--生产者消费者模式--synchronized版本
在实现生产者消费者模式之前,我们先了解一下线程的5种状态:被创建.运行.冻结.消亡.阻塞,如下图: 在Jdk1.5发布之前,我们实现生产者消费者模式一般使用synchronized + while循环 ...
- Python多线程实现生产者消费者模式
什么是生产者消费者模式 在软件开发的过程中,经常碰到这样的场景: 某些模块负责生产数据,这些数据由其他模块来负责处理(此处的模块可能是:函数.线程.进程等).产生数据的模块称为生产者,而处理数据的模块 ...
- Java线程实现生产者消费者模式
1 什么是生产者消费者模式 想一个现实生活中的例子,啤酒商---超市---消费者也就是我们,啤酒商生产了啤酒,然后将啤酒销售给了超市,我们消费之又会到超市将啤酒买回来自己喝,那么啤酒商和消费者之间是什 ...
- Java 并发(生产者/消费者 模式)
>生产者/消费者 模式角色:生产者,消费者都是线程,两者中间是容器,容器内部是产品. 要求: 容器 里面要定义容量 容器 往里面添加(满时等待) 或者 从里面删除(空时等待) ,都要是阻塞的(等 ...
- Java多线程编程——生产者消费者问题
一.问题介绍 生产者消费者问题是一个经典的多线程同步问题.该问题描述了两个进程--即所谓的"生产者"和"消费者"--在实际运行时会发生的问题.生产者的主要作用是 ...
最新文章
- 全球CMOS图像传感器厂商最新排名:黑马杀出
- Android wear
- python 生成数组1:1:20_英特尔“演化算法”新框架:29个Python代码块,自动生成新算法...
- spark 2.x ML概念与应用
- 前端学习(1295):第三方模块npm
- php 调用 com,PHP调用COM函数
- 基于消息队列 RocketMQ 的大型分布式应用上云实践
- java演练 数组的逆序文字玩法 你是猪才怪
- 两个fetion飞信API
- 2021 年高教社杯全国大学生数学建模竞赛题目(E 题 中药材的鉴别)
- 复制含有随机指针节点的链表
- css文本样式(一):css字体样式
- 方钢管弹性模量计算方式_弹性模量计算公式.doc
- 深度ip转换器手机版app_手机防爆卫士app下载-手机防爆卫士去广告版1.2.0旧版
- 计算机制图视频教程,机械制图视频教程
- editplus自动换行html,EditPlus如何自动换行
- 转载:技术大停滞——范式春梦中的地球工业文明5:台阶前的坑:人类社会的宿命
- 程序员网站运营手册1
- GTK、GDK、GLIB三者的关系 - 阿堂的专栏 - 博客频道 - CSDN.NET
- 康考迪亚大学应用计算机科学,康考迪亚大学.pdf