当前位置: 首页 > news >正文

Java中的生产消费模型解析

在工作中,我们往往会碰到需要两个不同模块分别生产和处理数据的场景,这时候我们就会用到生产消费模型。

一、概念

生产消费模型一般由三部分构成:生产者,容器,消费者。

生产者负责生产相关数据,并把生产的数据存储到容器中,而消费者则从容器中取出数据进行相关处理。

二、实现

下面我们来用Java代码对生产消费模型进行实现:

首先是容器设计,我们用数字链表数据量的增减模拟数据生产和消耗的过程,并且在仓库中写一个Lock锁作为保证线程安全锁。

public class Ware {ArrayList<Integer> ar=new ArrayList<>();Lock lock = new ReentrantLock();int max = 10;int start = 0;int size(){return ar.size();}void add(int num){ar.add(num);start++;}void remove(){ar.remove(start-1);start--;}
}

然后是生产者和消费者,用容器中的锁保证线程安全的情况下实现。

import java.util.concurrent.locks.Lock;public class Producer implements Runnable{Ware ware;Lock lock;Producer(Ware ware,Lock lock){this.ware = ware;this.lock = lock;}@Overridepublic void run() {while(true) {lock.lock();if (ware.size() >= ware.max) {System.out.println("队列阻塞,无法继续添加……");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}lock.unlock();}else {ware.add(ware.start);System.out.println("生产者线程启动,添加数据:"+ware.start);lock.unlock();}}}
}
import java.util.concurrent.locks.Lock;public class Customer implements Runnable {Ware ware;Lock lock;Customer(Ware ware, Lock lock) {this.ware = ware;this.lock = lock;}@Overridepublic void run() {while(true) {lock.lock();if(ware.size()==0){System.out.println("队列为空,无法继续消费……");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}lock.unlock();}else {System.out.println("消费者线程启动,消费数据:"+ware.start);ware.remove();lock.unlock();}}}
}

http://www.dtcms.com/a/270109.html

相关文章:

  • Distance Information Improves Heterogeneous Graph Neural Networks
  • 质量小议56 - 说教
  • [ESP32]VSCODE+ESP-IDF环境搭建及blink例程尝试(win10 win11均配置成功)
  • vscode打开stm32CubeIDE的项目的注释问题
  • 从分层训练到一步生成:Kaiming He 的生成模型进化之路—CVPR2025演讲小结
  • 网络--初级
  • springboot单体项目的发布生产优化
  • DMA(直接内存访问)是什么?
  • 第2章,[标签 Win32] :匈牙利标记法
  • 13届蓝桥杯省赛程序设计试题
  • 字符串大小比较的方式|函数的多返回值
  • 作业03-SparkSQL开发
  • 数字化校园升级:传统网络架构与SD-WAN智能方案对比详解
  • 汽车功能安全-软件单元验证 (Software Unit Verification)【定义、目的、要求建议】6
  • 【数据分析】基于 HRS 数据的多变量相关性分析与可视化
  • uniapp b树
  • C++笔记之使用bitset对uint32_t类型变量对位状态判断
  • 2025年深圳杉川机器人性格测评和Verify测评SHL题库高分攻略
  • 论文略读:Parameter-efficient transfer learning for NLP
  • InstructBLIP:迈向具备指令微调能力的通用视觉语言模型
  • Go语言标识符命名规则详解:工程化实践
  • Spring的依赖注入(xml)
  • RISC-V:开源芯浪潮下的技术突围与职业新赛道 (一)为什么RISC-V是颠覆性创新?
  • 安装 asciidoctor-vscode 最新版
  • 针对 SSD 固态硬盘的安全擦除 Secure Erase
  • Kotlin协程中的Job详解
  • 如何用Python编程计算权重?
  • Anolis OS 23 架构支持家族新成员:Anolis OS 23.3 版本及 RISC-V 预览版发布
  • 数据库设计精要:完整性和范式理论
  • 去掉长按遥控器power键后提示关机、飞行模式的弹窗