对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的。就像学习每一门编程语言一样,Hello World!都是最经典的例子。
实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了,利用前面说过的堵塞栈实现该模式异常简洁。
对于此模型,应该明确一下几点:
1、生产者仅仅在仓储未满时候生产,仓满则停止生产。
2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。
3、当消费者发现仓储没产品可消费时候会通知生产者生产。
4、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。
测试代码:
/** * java多线程模拟生产者消费者问题 * * ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品,Storage仓库 * * @author 吖大哥 */ public class ProducerConsumer { public static void main(String[] args) { ProducerConsumer pc = new ProducerConsumer(); Storage s = pc.new Storage(); ExecutorService service = Executors.newCachedThreadPool(); Producer p1 = pc.new Producer("张三", s); Producer p2 = pc.new Producer("李四", s); Consumer c1 = pc.new Consumer("王五", s); Consumer c2 = pc.new Consumer("老刘", s); Consumer c3 = pc.new Consumer("老林", s); service.submit(p1); // service.submit(p2); service.submit(c1); service.submit(c2); service.submit(c3); } // 消费者 class Consumer implements Runnable { private String name; private Storage s = null; public Consumer(String name, Storage s) { this.name = name; this.s = s; } public void run() { try { while (true) { System.out.println(name + "准备消费产品……"); Product product = s.pop(); System.out.println(name + "已消费(" + product + ")"); System.out.println("==============="); Thread.sleep(500); } } catch (InterruptedException e) { e.printStackTrace(); } } } // 生产者 class Producer implements Runnable { private String name; private Storage s = null; public Producer(String name, Storage s) { this.name = name; this.s = s; } public void run() { try { while (true) { Product product = new Product((int) (Math.random() * 10000)); // 产生0~9999随机整数 System.out.println(name + "准备生产(" + product + ")……"); s.push(product); System.out.println(name + "已生产(" + product + ")"); System.out.println("==============="); Thread.sleep(500); } } catch (InterruptedException e1) { e1.printStackTrace(); } } } // 仓库,用来存放产品 public class Storage { BlockingQueue<Product> queues = new LinkedBlockingQueue<Product>(10); // 生产 public void push(Product p) throws InterruptedException { queues.put(p); } // 消费 public Product pop() throws InterruptedException { return queues.take(); } } // 产品 public class Product { private int id; public Product(int id) { this.id = id; } public String toString() {// 重写toString方法 return "产品:" + this.id; } } }
相关推荐
TOPSIS法对应程序实现
新疆中小学教师计算机技术水平考核笔试模拟试题复习资料.docx
c&c++课程设计-学生成绩管理系统.zip
摘要 1 Abstract 1 目 录 2 1绪论 4 1.1研究背景与意义 4 1.2国内外研究现状 4 1.3研究内容 5 1.4论文结构 5 1.5本章小结 5 2理论基础 6 2.1 B/S模式 6 2.2 IDEA开发环境 6 2.3 MySQL数据库 6 2.4 Java语言 7 2.5本章小结 7 3需求分析 8 3.1功能需求分析 8 3.2技术需求分析 8 3.3数据需求分析 8 3.4安全需求分析 8 3.5可行性分析 8 3.5.1经济可行性 8 3.5.2技术可行性 9 3.5.3操作可行性 9 3.6本章小结 9 4系统设计 10 4.1系统功能设计 10 4.2数据库设计 10 4.2.1概念设计 10 4.2.2逻辑设计 11 4.3本章小结 11 5系统实现 13 5.1管理员功能模块实现 13 5.1.1管理员登录 13 5.1.2素材管理 13 5.1.3公告管理 13 5.1.4公告类型管理 14 5.3系统测试 14 5.3.1测试概述 14 5.3.2测试结果 14 5.3本章小结 15 6总结与展望 16 参考文献 17 致谢 18
基于Matlab-Simulink的静止型无功发生器SVG仿真 主电路为电压型桥式电路,电流解耦的双闭环控制策略,SVPWM 输出阻性负载转向感性负载,系统相电压与负载A相电流对比、阻性负载转向感性负载,负载有功电流和无功电流 程序已调通,可直接运行 ,基于Matlab-Simulink的SVG仿真; 电压型桥式电路; 电流解耦双闭环控制; SVPWM; 阻性负载转向感性负载; 系统相电压与负载电流对比。,Matlab-Simulink下的SVG仿真:电压型桥式电路与双闭环控制策略
TDengine-server-3.0.7.1-Windows-x64【服务端】
网络通信安全管理员培训网络信息安全管理.ppt
阅读习惯中的知识更新与追踪
,,射流气动噪声近场远场计算(3节) 包括 fluent流场求解导出 Lms近场声辐射计算 Lms远场声辐射计算 可以解决:射流仿真基本步骤,四极子声源导出设置等问题,可以绘制各阶频率下的声压云图,噪声频谱图等。 ,射流噪声计算;Lms近远场声辐射计算;fluent流场求解导出;四极子声源导出设置;声压云图绘制;噪声频谱图。,《流场与声辐射计算技术:射流噪声分析方法》
# 程序详解 ## 核心功能模块 1. **环境建模模块** - 支持10节点可扩展基站布局,采用三角函数生成三维空间分布 - 构建对数路径损耗模型:$RSSI(d) = RSSI_0 - 10n\log_{10}(d) + \varepsilon$ - 模拟运动轨迹:包含X-Y平面线性运动与Z轴悬停的复合运动模式 2. **信号处理模块** - 动态计算基站-目标距离矩阵 - 添加高斯噪声模拟真实信号强度波动 - 采用伪逆矩阵法解超定方程组,实现三维坐标最小二乘估计 3. **滤波优化模块** - 构建9维状态空间模型(位置+速度+加速度) - 设定过程噪声$Q=0.01I_3$与观测噪声$R=0.1I_3$协方差矩阵 - 实施EKF预测-校正双阶段迭代: - 状态预测:$\hat{X}_k^- = F\hat{X}_{k-1} + w_k$ - 协方差传播:$P_k^- = FP_{k-1}F^T + Q$ - 卡尔曼增益:$K_k = P_k^-H^T(HP_k^-H^T + R)
本文是 “从入门到精通:Java 数组进阶全解析” 教程。开篇回顾数组基础,如定义、声明、初始化、元素访问等。随后深入一维数组进阶,剖析动态与静态初始化差异,介绍元素访问、修改及遍历技巧与优化。详细讲解二维数组概念、创建、初始化、元素访问及遍历。阐述数组常见操作,包括拷贝、查找、排序,还介绍数组与集合的转换。最后通过数据统计、矩阵运算、缓存与数据存储等实际项目案例,展示数组应用。旨在助力读者全面掌握 Java 数组进阶知识,提升编程能力。
互联网大数据获取和分析作业
微机原理与接口技术复习重点很有用哦.ppt
采用comsol模拟了波导的热释电及其引起的电光调制效应 第一个案例:铌酸锂的温度漂移受到热释电的影响,本案例复现了一篇lunwen中的z切铌酸锂波导的热释电感应电压,lunwen中的值为293V每℃,复现的结果为约为292.94V每℃,基本正常,随后,在案例中通过修改某个关键参数获得了完全一致的结果 还包括一个因热释电引起的电光调制效应的小案例,总共俩个小案例,可随时,提供参考文献 ,comsol模拟; 铌酸锂波导; 热释电; 温度漂移; 电光调制效应,基于COMSOL模拟波导热释电与电光调制效应的案例研究
实验报告—升压斩波电路闭环控制和降压斩波电路闭环控制,simulink仿真和psim仿真,实验报告一共3000字数,基本内容包含参数计算,原理分析等 ,实验报告; 升压斩波电路闭环控制; 降压斩波电路闭环控制; Simulink仿真; PSIM仿真; 参数计算; 原理分析,斩波电路闭环控制实验报告——Simulink与Psim仿真研究
windows版本php8.2-redis拓展,实测可用
基于stm32的环境温湿度监测系统设计(DHT11) ,基于STM32; 温湿度监测; 系统设计; DHT11; 传感器应用,基于STM32的DHT11温湿度监测系统设计
华为账号注册&添加成员操作手册
视频大数据存储平台解决方案.ppt
AlphaFold3模型权重文件 AlphaFold 3 model parameters 文件详情: af3.bin.zst (973.27MB) ,AlphaFold3模型权重文件; af3.bin.zst; 模型参数,AlphaFold3模型权重与参数文件详解