多线程同步之生产者---消费者模型

2023-11-07

额,腾讯二面的时候,被问到了这个模型。很不幸啊,不会用代码来实现。

生产者消费者模型

 
对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的。就像学习每一门编程语言一样,Hello World!都是最经典的例子。
 
实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了。
对于此模型,应该明确一下几点:
1、生产者仅仅在仓储未满时候生产,仓满则停止生产。
2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。
3、当消费者发现仓储没产品可消费时候会通知生产者生产。
4、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。
java实现的时候,如果消费者线程发现没有可以消费的食物,那么就调用自己的wait()操作(我答成了sleep()操作)来释放对象监视器
同样地,如果生产者发现仓库是满的,那么也调用自己的wait()操作来释放对象监视器(其实就是释放锁)


仓库地定义如下:
public class Godown {
	public static final int max_size = 100;
	public int curnum;
	Godown(){
		
	}
	Godown(int curnum){
		this.curnum = curnum;
	}
	public synchronized void produce(int neednum){
		while (neednum + curnum > max_size){
			System.out.println("超过库存,无法生产!");
			try{
				wait();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		curnum += neednum;
		System.out.println("已经生产了" + neednum + "个产品"+
				"现在仓库里面一共有" + curnum + "个产品");
		notifyAll();
	}
	public synchronized void consume(int neednum){
		while(curnum < neednum){
			try{
				wait();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		curnum -= neednum;
		System.out.println("已经消费了" + neednum + "个产品"+
				"现在仓库里面一共有" + curnum + "个产品");
		notifyAll();
	}
}

消费者线程
public class Consumer extends Thread {
	private int neednum;
	private Godown godown;
	Consumer(int neednum, Godown godown){
		this.godown = godown;
		this.neednum = neednum;
	}
	public void run(){
		godown.consume(neednum);
	}
}

生产者线程
class Producer extends Thread{
	private int neednum;
	private Godown godown;
	Producer(int neednum, Godown godown){
		this.godown = godown;
		this.neednum = neednum;
	}
	public void run(){
		godown.produce(neednum);
	}
}

测试程序:
public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Godown godown = new Godown(30);
		Consumer c1 = new Consumer(50,godown);
		Consumer c2 = new Consumer(30,godown);
		Consumer c3 = new Consumer(20,godown);
		Producer p1 = new Producer(10,godown);
		Producer p2 = new Producer(10,godown);
		Producer p3 = new Producer(10,godown);
		Producer p4 = new Producer(10,godown);
		Producer p5 = new Producer(10,godown);
		Producer p6 = new Producer(10,godown);
		Producer p7 = new Producer(80,godown);
		c1.start();
		c2.start();
		c3.start();
		p1.start();
		p2.start();
		p3.start();
		p4.start();
		p5.start();
		p6.start();
		p7.start();
	}

}

测试结果:
已经消费了30个产品现在仓库里面一共有0个产品
已经生产了10个产品现在仓库里面一共有10个产品
已经生产了10个产品现在仓库里面一共有20个产品
已经消费了20个产品现在仓库里面一共有0个产品
已经生产了10个产品现在仓库里面一共有10个产品
已经生产了10个产品现在仓库里面一共有20个产品
已经生产了80个产品现在仓库里面一共有100个产品
已经消费了50个产品现在仓库里面一共有50个产品
已经生产了10个产品现在仓库里面一共有60个产品
已经生产了10个产品现在仓库里面一共有70个产品
 


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

多线程同步之生产者---消费者模型 的相关文章

  • 如何在 VS2015 中使用 Intellisense 查看抛出哪些异常?

    这个问题已在 VS2015 Update 1 中得到解决和修复 有没有办法在VS2015中显示异常 VS2015 VS2013 在您实际编写代码之前 它似乎不再显示在智能感知工具提示中 一旦代码出现 将鼠标悬停在其上即可使其完整显示 注意
  • 处理异步并行任务的多个异常

    Problem 多个任务并行运行 所有任务 没有任务或其中任何任务都可能抛出异常 当所有任务完成后 必须报告所有可能发生的异常 通过日志 电子邮件 控制台输出 等等 预期行为 我可以通过 linq 使用异步 lambda 构建所有任务 然后
  • 如何使用javascript通过类名更改html元素的值

    这是我用来更改 html 元素值的代码 a class classname href Vtech com This text to be chnage a 如何在页面加载瞬间更改此文本 看来你需要添加DOMContentLoaded或者把你
  • Meteor 抛出 throwIfSelectorIsNotId 异常

    运行某些代码时 Meteor 会抛出 throwIfSelectorIsNotId 异常 我有两个客户端运行相同的代码 当第二个客户端运行相同的代码时会引发异常 无法弄清楚这个异常的含义以及抛出的原因 希望有人能够解释一下 对于客户端上的某
  • Create CFrameWnd 给出了第一次机会异常——为什么?

    我正在尝试使用基于 CFrameWnd 的代码编写一个简单的 MFC 应用程序 该应用程序在可滚动窗口中绘制 下面的代码改编自 Prosise Programming Windows with MFC 第 2 版 第 89ff 页 当我在调
  • 如何单独捕获这些异常?

    我正在编写一个与 Quickbooks 交互的 Python 程序 连接到 Quickbooks 时 根据问题的不同 我可能会遇到以下两个常见异常之一 pywintypes com error 2147352567 Exception oc
  • Elasticsearch 关于“空索引”的查询

    在我的应用程序中 我使用了几个elasticsearch索引 它们在初始状态下不包含索引文档 我认为这可以称为 空 该文档的映射是正确且有效的 该应用程序还有一个包含实体的关系数据库 这些实体可能具有在 elasticsearch 中关联的
  • 类、模块、它们的特征类和方法查找

    我们来开公开课吧Module并向其中添加一个方法 class Module def foo puts phew end end 我可以通过这样做来调用这个方法 Class foo 这是可以理解的 因为类Class is Class 其超类是
  • C++类名冲突

    我现在正在做一个项目 需要整合两个子项目 项目A是用C 编写的 项目B是用C编写的 一个问题是 在项目B中 有一个名为vector它是由其作者创建的 在项目 A 中 std vector in STL用来 因为项目B以后可能会更新 所以我不
  • ASP.NET Web Api 2 中的异常处理

    Problem 我需要处理 Web api 2 异常并返回一个具有正确状态代码的丰富对象 401 表示未经授权 404 表示 ContentNotFound 等 以及一些额外信息作为内容 此外 我需要内容看起来像序列化的Exception对
  • 如何确定异常是否属于特定类型

    我有一段 try catch 代码 try catch Exception ex ModelState AddModelError duplicateInvoiceNumberOrganisation The combination of
  • 使用异步任务

    如果这是一个简单的问题 我很抱歉 但我对此很陌生并且仍在学习 我有一个应用程序 当我的用户在输入详细信息后单击按钮登录时 它因 android os NetworkOnMainThreadException 崩溃 我发现这是因为我正在主线程
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 动态创建类 - Python

    我需要动态创建一个类 为了更详细地讲 我需要动态创建 Django 的子类Form class 通过 动态 我打算根据用户提供的配置创建一个类 e g 我想要一个名为CommentForm这应该子类化Form class 该类应该有一个选定
  • 内联函数以及类和头文件

    头文件中定义的任何函数都会自动内联吗 如果我在类中声明一个函数并使用关键字 inline 在外部给出定义 那么这个函数会是内联的吗 如果是 为什么这不违反内联函数应在声明时赋予主体的法律 类定义中定义的任何函数都是内联的 任何标记的功能in
  • R 中使用 `UseMethod()` 与 `inherits()` 来确定对象的类

    如果我需要根据 R 对象的类以不同的方式处理它们 我可以使用if and else在单个函数内 foo lt function x if inherits x list Foo the list else if inherits x num
  • Python 2 的 `exceptions` 模块在 Python3 中丢失了,它的内容到哪里去了?

    一位朋友提到 对于 Python 2 假设您在命令行上的路径环境变量中有它 pydoc exceptions 非常有用 知道它应该可以为他每周节省几分钟的网络查找时间 我自己每周都会用谷歌搜索一次例外层次结构 所以这对我来说也是一个有用的提
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 时间:2019-03-17 标签:c#backgroundworker和partialclass

    我在实现从堆栈溢出获得的代码时遇到问题 它是关于终止后台工作进程的 我的代码如下 using System using System Collections Generic using System Data using System Dr
  • 如何将数据传递给 MATLAB oncleanup 函数?

    我有一个编译好的 matlab 程序 可以自动调整机器参数 在调整周期结束时 我需要恢复一些原始设置 有时会发生意外错误 有时用户会发现调整算法未正常工作 因此应终止 使用 control C 如果发生可预测的错误 我可以使用 try ca

随机推荐

  • 使用MyBatis分页插件PageHelper遇到的问题

    最近在使用mybatis的PageHelper进行分页查询时 遇到了不少问题 总结一下希望能帮到别人 1 版本错误 报错如下 java lang NoSuchMethodError java util List net sf jsqlpar
  • 关于调用Callable时的一个问题分享--总是只输出最后一次数据

    问题描述 我本来想使用线程池 ExecutorService Callable实现多线程处理数据 测试过程发现 只循环2到3次时 最终输出的数据只有最后一次遍历的数据 很奇怪 遇到问题解决问题 1 首先把我的测试代码贴出来 1 1 测试代码
  • Java导出压缩文件

    在很多场景需要导出很多的文件 将其压缩成zip是一个很不错的选择 先将要压缩的文件路径和名称得到 然后用工具类将其压缩 代码逻辑清晰 使用得修改一些文件路径 实现类中导出方法中 String zipFileName 工单附件 new Sim
  • 剑指 Offer 12. 矩阵中的路径

    题解 dfs 对棋盘里的每个点都dfs一遍 看是否有合适的字符串 当找到最后一个字符位置 并且最后一个字符 并且当前字符串匹配 那么为真 注意回溯之后的标记需要改成false 因为需要回溯进行查找 class Solution public
  • Hive启停脚本

    bin bash HIVE LOG DIR HIVE HOME logs if d HIVE LOG DIR then mkdir p HIVE LOG DIR fi 检查进程是否运行正常 参数 1 为进程名 参数 2 为进程端口 func
  • Spring Cloud Alibaba Sentinel 整合 nacos 进行规则持久化

    上篇文章Spring Cloud Alibaba Sentinel 初体验介绍了Sentinel 的简单使用 在使用过程中我们发现在Sentinel 控制台中配置了规则之后 随着服务的重启 配置的规则也随之消失 Sentinel 控制台控制
  • 写成生成以给定的p为参数的伯努利样本的程序,并写出由样本计算p的程序

    根据给定的参数p 编写伯努利样本的程序如下 def bernoulli sample p 定义一个变量x x 0 产生一个0 1之间的随机数 r random random 若随机数小于等于p 则x 1 if r lt p x 1 返回x
  • python判断一个字符串是不是ip地址

    文章目录 一 解决思路 二 判断代码 一 解决思路 满足什么条件的叫ip地址 1 先判断它是不是由4段数字用点号 分隔开 2 再判断每段数字的十进制是不是在0 255之间 满足以上条件就是正确的IP地址 那么解决思路就来了 1 拿到IP 先
  • 如何过掉前端Chrome的debugger反调试

    1 禁用浏览器断点 点击图中按钮 之后将不会再命中任何断点 这种方法虽然可以防止无限循环命中debugger断点 但是也存在很大的缺陷 因为对于其他代码 我们还是需要断点调试功能的 所以这个方法仅限于静态分析 2 直接使用debugger指
  • 唯品会测试工程师面试

    秋招 笔试题是后台 前端 测试同一套的题 考基础 面试 2014 09 25 一面 为什么做测试 测试遇到的最大的困难 python和java做的网站的区别 参加过什么社团活动 有没有上唯品会买过东西要你测怎么测 有哪些测试方法举例说 HR
  • 解决 深度学习docker 端口连接被对方重设

    在容器中启动 jupyter notebook 的时候 请指定 ip 为 0 0 0 0 aka 原因 docker启动的时候 我们的命令是 p 8888 8888 比如 sudo nvidia docker run it p 8888 8
  • 输入年份,判断输入的年份是否是闰年。(闰年的条件是能被 4 整除,但不能被 100 整除;或能被 400 整除。)

    public class Task 10101003 02 public static void main String args Scanner input new Scanner System in System out println
  • Charles证书-手机刷入系统信任证书

    最近面试需要 重新捡起了爬虫 在抓包的时候发现尽管按照Charles的要求去安装证书 还是会抓不到https的包 最后发现需要把用户信任证书是不够的 需要系统信任证书才行 第一步 把代理设置成Charles的代理 具体做法 Help SSL
  • 【机器学习基本理论】详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解

    机器学习基本理论 详解最大似然估计 MLE 最大后验概率估计 MAP 以及贝叶斯公式的理解 https mp weixin qq com s 6H0gmMWvTExySMraroLVlQ 最大似然估计 Maximum likelihood
  • 使用teamviewer搭建内网服务器。

    目录 起因 下载并安装teamviewer 服务器安装ccproxy 客户端使用SwitchyOmega 起因 学习的时候 学习视频必须使用校内的网络才能连接观看 校外无法观看 所以使用teamviewer和proxy搭建一个方便访问的服务
  • 绝对定位的元素宽度自动撑开

    position absolute white space nowrap
  • java传输json数据用md5加密过程

    1 加密过程 客户端传输数据 包含两部分 一部分原始数据 一部分签名 签名就是对原始数据MD5加密后的字节序列 而原始数据就是普通的string字符串 2 服务器端呢 将收到的原始数据 进行MD5加密后得到字节序列 将这个字节序列与传输过来
  • UDP客户端程序(C语言)

    UDP客户端程序 与UDP服务器端程序配合使用 Visual Stdio 运行 UDP客户端 cpp 定义控制台应用程序的入口点 include stdafx h include
  • 使用libevent编写高并发HTTP server

    libevent库使得高并发响应HTTP Server的编写变得很容易 整个过程包括如下几部 初始化 创建HTTP Server 指定callback 进入事件循环 另外在回调函数中 可以获取客户端请求 request的HTTP Heade
  • 多线程同步之生产者---消费者模型

    额 腾讯二面的时候 被问到了这个模型 很不幸啊 不会用代码来实现 生产者消费者模型 对于多线程程序来说 不管任何编程语言 生产者和消费者模型都是最经典的 就像学习每一门编程语言一样 Hello World 都是最经典的例子 实际上 准确说应