Java多线程编程学习笔记之十二:生产者—消费者模型(含代码)

2023-05-16

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17249321

生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据。

这里实现如下情况的生产--消费模型:

生产者不断交替地生产两组数据“姓名--1 --> 内容--1”,“姓名--2--> 内容--2”,消费者不断交替地取得这两组数据,这里的姓名--1”和“姓名--2模拟为数据的名称,“内容--1 ”和“内容--2 ”模拟为数据的内容。

由于本程序中牵扯到线程运行的不确定性,因此可能会出现以下问题:

1、假设生产者线程刚向数据存储空间添加了数据的名称,还没有加入该信息的内容,程序就切换到了消费者线程,消费者线程将把信息的名称和上一个信息的内容联系在一起;

2、生产者生产了若干次数据,消费者才开始取数据,或者是,消费者取完一次数据后,还没等生产者放入新的数据,又重复取出了已取过的数据。

问题1很明显要靠同步来解决,问题2则需要线程间通信,生产者线程放入数据后,通知消费者线程取出数据,消费者线程取出数据后,通知生产者线程生产数据,这里用wait/notify机制来实现。

详细的实现代码如下:

class Info{	// 定义信息类
	private String name = "name";//定义name属性,为了与下面set的name属性区别开
	private String content = "content" ;// 定义content属性,为了与下面set的content属性区别开
	private boolean flag = true ;	// 设置标志位,初始时先生产
	public synchronized void set(String name,String content){
		while(!flag){
			try{
				super.wait() ;
			}catch(InterruptedException e){
				e.printStackTrace() ;
			}
		}
		this.setName(name) ;	// 设置名称
		try{
			Thread.sleep(300) ;
		}catch(InterruptedException e){
			e.printStackTrace() ;
		}
		this.setContent(content) ;	// 设置内容
		flag  = false ;	// 改变标志位,表示可以取走
		super.notify();
	}
	public synchronized void get(){
		while(flag){
			try{
				super.wait() ;
			}catch(InterruptedException e){
				e.printStackTrace() ;
			}
		}
		try{
			Thread.sleep(300) ;
		}catch(InterruptedException e){
			e.printStackTrace() ;
		}
		System.out.println(this.getName() + 
			" --> " + this.getContent()) ;
		flag  = true ;	// 改变标志位,表示可以生产
		super.notify();
	}
	public void setName(String name){
		this.name = name ;
	}
	public void setContent(String content){
		this.content = content ;
	}
	public String getName(){
		return this.name ;
	}
	public String getContent(){
		return this.content ;
	}
}
class Producer implements Runnable{	// 通过Runnable实现多线程
	private Info info = null ;		// 保存Info引用
	public Producer(Info info){
		this.info = info ;
	}
	public void run(){
		boolean flag = true ;	// 定义标记位
		for(int i=0;i<10;i++){
			if(flag){
				this.info.set("姓名--1","内容--1") ;	// 设置名称
				flag = false ;
			}else{
				this.info.set("姓名--2","内容--2") ;	// 设置名称
				flag = true ;
			}
		}
	}
}
class Consumer implements Runnable{
	private Info info = null ;
	public Consumer(Info info){
		this.info = info ;
	}
	public void run(){
		for(int i=0;i<10;i++){
			this.info.get() ;
		}
	}
}
public class ThreadCaseDemo03{
	public static void main(String args[]){
		Info info = new Info();	// 实例化Info对象
		Producer pro = new Producer(info) ;	// 生产者
		Consumer con = new Consumer(info) ;	// 消费者
		new Thread(pro).start() ;
		//启动了生产者线程后,再启动消费者线程
		try{
			Thread.sleep(500) ;
		}catch(InterruptedException e){
			e.printStackTrace() ;
		}

		new Thread(con).start() ;
	}
}


执行结果如下:

另外,在run方法中,二者循环的次数要相同,否则,当一方的循环结束时,另一方的循环依然继续,它会阻塞在wait()方法处,而等不到对方的notify通知。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java多线程编程学习笔记之十二:生产者—消费者模型(含代码) 的相关文章

  • Eclipse中js文件含中文无法保存的问题解决

    js文件含中文时会报Save could not be completed xff0c 而无法保存 因为js 文件默认是 ISO8859 1 编码 xff0c 解决方法如下 xff1a 在 Window 菜单里面找到 Preferences
  • 浅谈如何学习linux

    一 为什么要学linux 当然最重要是爱好和兴趣 xff01 如果你这种必要学 xff0c 或者根本不喜欢 xff0c 请不要浪费时间 xff0c 你学也学不好 xff01 二 起步 你应该为自己创造一个学习linux的环境 在电脑上装一个
  • FreeRTOS学习日记-4(调度开启与任务相关函数深究)

    任务调度器开启函数vTaskStartScheduler 与空闲任务 这个函数内会自动创建一个名为 IDLE 空闲任务 xReturn 61 xTaskCreate prvIdleTask 1 34 IDLE 34 configMINIMA
  • 面向应用服务器的开发

    ooa oop 太慢了 现在流行ooas的开发 xff0c 我称之为面向应用服务器的开发 比如 两年前流行在wls上写ejb 五年前流行在win上写com 等等 xff0c win不是os吗 xff0c 怎么叫它做as 没错的 xff0c
  • 8086的最小模式和最大模式

    一 最小模式和最大模式 8086 8088可以在两种工作模式下工作 xff0c 即最小模式和最大模式 最小模式 xff0d xff0d 即系统中只有8086 xff08 或 8088 xff09 一个微处理器 最小模式是单处理器系统 系统中
  • udp cksum

    目前碰到一个奇怪的现象 xff0c 某台机器 xff08 就叫hostA吧 xff09 上面tx checksumming是开启状态下 xff0c 所有本地发出去的UDP报文用tcpdump vvv udp抓出来 xff0c 凡是从这台主机
  • java菜鸟程序员2012年度总结——分享、收获与感恩并存

    前言 xff1a 又是一年总结时啊 本来总结打算前几天就该写的 但由于一直在忙最后的期末考试 xff0c 今天终于考完了 现在终于有时间来对这一年进行总一下了 刚开始的时候想了半天不知道该用什么题目好 想了想 xff0c 今年的博客一直围绕
  • C语言 推箱子小游戏 可重玩 可选关 保存记录

    转载请保留此行 xff0c 来自Vic 这是DLNU大一的题目 xff0c 估计我发上来后 xff0c 这个课题的难度大大降低 可以随意增加地图 根据20 20的画就行 0 可移动 1 墙 2 目的地 3 箱子 5 玩家 记得也要增加 存在
  • C/C++ 获得键盘按键代码

    写推箱子小游戏的时候需要读取键盘 写了个快速获得代码的小程序 include lt iostream gt include lt conio h gt int main int a while 1 a 61 getch std cout l
  • C语言中的转义字符

    C语言中的转义字符 简介 在字符集中 xff0c 有一类字符具有这样的特性 xff1a 当从键盘上输入这个字符时 xff0c 显示器上就可以显示这个字符 xff0c 即输入什么就显示什么 这类字符称为可显示字符 xff0c 如a b c 4
  • Eclipse:全局搜索和更替

    Eclipse 中全局搜索和更替 Eclipse 全局搜索步骤 使用快捷键 ctrl 43 H 打开文件搜索对话框 xff0c 选择 File Search 标签 xff0c 在 Containing text 中输入你需要搜索的字符串 x
  • 研发人员绩效评价常见误区

    1 光环化 xff1a 将被评价人某一优点或缺点扩大 xff0c 以偏概全 xff0c 一好百好 xff0c 或一无是处 xff0c 凭个人印象评价下属 2 宽容化 严格化 xff1a 评价人怕承担责任 xff0c 有意放松评价标准 xff
  • malloc分配的内存空间是连续的吗

    1 linux内核管理内存空间的分配 xff0c 所有程序对内存空间的申请和其他操作 xff0c 最终都会交给内核来管理 2 linux实现的是 虚拟内存系统 xff0c 对用户而言 xff0c 所有内存都是虚拟的 xff0c 也就是说程序
  • NLP参考资源

    https antkillerfarm github io NLP参考资源 https mp weixin qq com s 4eyxX EfrImGXnYmTRUFHw 自然语言处理 NLP 入门指南 https www geekhub
  • 找工作笔试面试那些事儿(15)---互联网公司面试的零零种种和多家经验

    作者 xff1a 寒小阳 时间 xff1a 2013年9月 出处 xff1a http blog csdn net han xiaoyang article details 11400719 声明 xff1a 版权所有 xff0c 转载请注
  • 一个很有趣的问题:那些用QQ邮箱发应聘邮件的人啊(附:怎样写一封得体的电子邮件)...

    最近这个话题频频出现 xff0c 而且讨论地越来越激烈 xff0c 也越来越有趣 最开始是在人人网上当做笑口被大家广为扩散的那张图片 xff0c 某大学在申请出国联系导师的时候使用 数字 64 qq com的邮箱 xff1b 之后又有了如下
  • linux(边压缩边传输边解压)

    比如我要转移旧VPS home wwwroot 下的web目录到新VPS 123 123 123 123 的 home wwwroot 目录下 1 进入目录 cd home wwwroot 2 压缩 xff0c 传输 xff0c 解压同步进
  • 让Editplus和SVN集成

    很多人用Editplus xff0c 但是修改了文件后 xff0c 需要切换到文件目录 xff0c 点击鼠标右键使用TortoiseSVN的提交菜单项来提交 xff0c 需要增加很多鼠标点击和确认的操作 xff0c 对于频繁修改的文件来说
  • 服务器是否支持断点续传

    通常情况下 xff0c Web服务器 如Apache 会默认开启对断点续传的支持 因此 xff0c 如果直接通过Web服务器来提供文件的下载 xff0c 可以不必做特别的配置 xff0c 即可享受到断点续传的好处 断点续传是在发起HTTP请
  • git-cola

    http git cola github io downloads html you can get a binary git cola https github com git cola git cola archive v2 3 tar

随机推荐

  • 北邮IT类就业攻略

    发信人 noobody everybody 信区 Job 标 题 北邮IT类就业攻略 发信站 北邮人论坛 Sun Sep 6 12 16 28 2009 站内 不久前发了那篇 盘点IT类就业方向 的文章 xff0c 感受到了师弟师妹们对找工
  • Android开发又将带来新一轮热潮,很多开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的...

    Android开发又将带来新一轮热潮 xff0c 很多开发者都投入到这个浪潮中去了 xff0c 创造了许许多多相当优秀的 应用 其中也有许许多多的开发者提供了应用开源项 目 xff0c 贡献出他们的智慧和创造力 学习开源代码 是掌握技术的一
  • 关于Java加密扩展的出口限制

    近日 xff0c 在Matrix Security版上 http www matrix org cn thread shtml topicId 61 39543 amp forumId 61 55 提出一个问题 xff0c 即他的程序不能正
  • Win7 USB接口无法使用/驱动错误/该设备无法启动。(代码10) 故障解决方法

    电脑USB接口突然有一个不能用了 xff0c 开始以为是驱动问题 xff0c 可是用好几个驱动软件 xff08 驱动精灵 驱动人生等 xff09 更新驱动都无法解决 xff0c 后来发现在设备管理器里有一个设备驱动有问题 xff0c 尝试卸
  • Linux操作手册

    Linux操作手册 查看防火墙是否开启 systemctl status firewalld 开启防火墙 systemctl start firewalld 关闭防火墙 systemctl stop firewalld 查看所有开启的端口
  • 【转】实现电子词典要解决的技术问题及初步的解答

    转自 url http www blogjava net nokiaguy archive 2010 07 31 327623 html url quote 英文词典是手机中经常使用的应用 因此 xff0c 在本文将结合Android来讨论
  • 关于I2C和SPI总线协议

    关于I2C和SPI总线协议 IICvs SPI 现今 xff0c 在低端数字通信应用领域 xff0c 我们随处可见IIC Inter Integrated Circuit 和 SPI Serial Peripheral Interface
  • strchr()、strrchr()、strchrnul()函数

    原文链接 xff1a http blog sina com cn s blog 8b745a5f01017t8b html 头文件 xff1a include 函数原型 xff1a char strchr char str int c ch
  • 面向对象编程之分层思想

    分层 xff1a 就是为了忽略细节 xff0c 关注自己需要关注的地方 1 实体层 xff1a 分析模块所要设计的表 xff0c 确定表之间的关系 gt 编写hibernate Mapping 文件和持久化实体类 2 DAO层 xff1a
  • Linux_apt-get remove 与 apt-get autoremove、aptitude remove的不同

    apt get remove 与 apt get autoremove aptitude remove 的不同 apt get remove 的行为我们很好理解 xff0c 就是删除某个包的同时 xff0c 删除依赖于它的包 例如 xff1
  • 再见,2011

    2011 xff0c 又是匆匆的一年 悄然回首 xff0c 得到的 xff0c 失去的 xff0c 欢乐的 xff0c 酸楚的 xff0c 每天都在交错 即将过去的201一年注定不平凡的是一年 xff0c 是难忘的一年 xff0c 是蛋疼的
  • pptv web前端面试题答案

    这是星期一考完试 xff0c 答应星期三补上的 xff0c 代码很简单 xff0c 就不写注释了 php快排 function quickSort amp arr arr left 61 new array arr right 61 new
  • Android初级教程_在电脑上共享手机屏幕

    我们知道有的时候需要截取手机屏幕 可以通过豌豆荚 91助手等工具 第一这种方式在电脑上看到的手机屏幕比实际的要小 第二 需要安装此类软件 有时候该类软件和eclipse开发Android的时候可能冲突 连接不到adb 我们可以通过一下方式来
  • CMake 执行shell

    使用cmake时 xff0c 可以在cmakelist txt中如下执行shell 一 xff0c 方法1 set LOG 34 log txt 34 add custom command OUTPUT LOG COMMAND echo 3
  • 我对产品化的理解

    我对产品化的理解 产品化的时机是看业务的需要 xff0c 不管是对前景的落实 xff0c 还是项目转化成产品 xff0c 这些都不是技术人员能考虑的 xff0c 业务的发展和策划 xff0c 如何进行市场细化等如果都由技术人员考虑 xff0
  • PostMan中文设置

    第一 xff0c 打开postman所在文件的位置 查看自己的版本号 第二 xff0c 打开下面的链接找到对应的版本号下载 页面链接 xff1a https gitee com hlmd PostmanCn releases 下载好后回到p
  • Ubuntu下构建PX4软件

    本搭建过程基于http dev px4 io starting building html xff0c 希望大家互相交流学习 原文 xff1a Building PX4 Software xff08 构建PX4软件 xff09 PX4 ca
  • 什么是scrum中的3355?

    3355表示的是3个核心角色 xff0c 3个工件 xff0c 5个关键事件以及5大价值观 3个工件 xff1a 产品Backlog Sprint Backlog 潜在可交付软件增量 3个核心角色 xff1a 产品负责人 xff08 PO
  • sockaddr_in , sockaddr , in_addr区别Socket编程函数集(非常有用)

    一 sockaddr和sockaddr in在字节长度上都为16个BYTE xff0c 可以进行转换 struct sockaddr unsigned short sa family 2 char sa data 14 14 上面是通用的s
  • Java多线程编程学习笔记之十二:生产者—消费者模型(含代码)

    转载请注明出处 xff1a http blog csdn net ns code article details 17249321 生产者消费者问题是线程模型中的经典问题 xff1a 生产者和消费者在同一时间段内共用同一存储空间 xff0c