生产者消费者应用实例
先简单介绍一下业务逻辑, 很简单, 每个生产逻辑线程在 得到一个需要待处理的数据之后, 封装之并作为一个对象塞入到一个 业务对象池中.(下文我们对这些线程, 称之为生产者)
然后另外一个(或者多个)消费线程不断的轮询这个 业务对象池, 看是否存在未处理对象, 若有就提取一个出来做相应的处理并从池中清除. 如果没有,则线程会sleep一会儿.(下文我们对这种线程, 称之为消费者)
这个轮询的模型在业务量比较小的时候是没有问题的,而且实现也很简单.但是如果生产者涌入数量非常多而且非常快, 这个时候消费者的处理能力就会急剧下降.
轮询方式的模型:
共享的对象池 pool , 标黑的为synchronzied同步块.
消费者:
while (true) {
Object obj = null; // 待处理对象
synchronized (pool ) {
if (pool .size() >= 1) {
obj = pool.get(0); // 对象池中提取一个待处理对象.例如list就是remove(0)
} else {
obj = null;
}
}
if (obj == null) {
Thread.sleep(10); // 如果没有, 则会暂停一会儿. 统一为10ms
} else {
doSomething(obj); // 处理这个对象
}
}
生产者:
synchronized (pool ) {
pool .add(object); // 塞入一个待处理的对象.
}
等待-通知模型:
消费者:
while (true) {
Object obj = null;
synchronized (pool ) {
while (pool .size() <= 0) { // 注意这里必须用while而不能用if 判断,否则会产生所谓的 虚假唤醒 (spurious wakeup)。
pool .wait(); // 等待通知
}
obj = pool .get(0);
}
doSomething(obj); // 如果不放心这里还可以为空判断, 但是理论上应该不可能出现.(pool中没有空对象的话)
}
生产者:
synchronized (pool ) {
pool .add(input);
pool .notify(); // 唤醒等待的线程
}
经过测试.在生产者和消费者都较多的情况下, 等待-通知模型比轮询方式吞吐量是具有数量级的优势的, 但是当都很小的时候这两种方式的区别并不大, 这个是可以理解的.毕竟等待的线程被唤醒之后也是需要平等的同其他线程 一起来争取对 对象池pool的使用权, 同时我也发现, 在 标准的生产者-消费者模型中, 其系统吞吐量比目前这种等待-通知模型的吞吐量又提升了一个数量级. 开始的时候稍微有点迷惑, 后来简单想想,其实这样也对, 在标准的模型中,每当消费者发现没有数据的时候.会立即通知生产者进行生产, 两者之间是主动的. 而在实际业务模式中,没有用户访问我们的系统, 也就无从生产数据了. 是一个被动的过程. 所以其吞吐量比较低也是可以理解的.
相关推荐
生产者消费者模型及在Python编程中的应用实例
生产者消费者模型是一种常见的并发编程模型,用于解决生产者和消费者之间的数据传递和同步问题。总结起来,生产者消费者模型提供了一种有效的并发编程模式,适用于解决生产者和消费者之间的数据传递和同步问题。在Python中,我们可以使用多线程或多进程来实现该模型,通过合适的同步机制和数据结构,实现线程安全和正确的数据处理。在实际应用中,我们可以根据需要对生产者和消费者的数量进行调整,并在数据生产和消费的过程中进行适当的同步和控制,以确保线程安全和数据的正确处理。然后,我们创建了生产者线程和消费者线程,并使用。
【雷达信号处理】数字下变频(DDC)(Matlab代码实现)
内容概要:本文介绍了基于MATLAB的雷达信号处理中数字下变频(DDC)技术的实现方法,重点阐述了DDC在雷达接收机前端信号处理中的关键作用。通过将高频回波信号下变频至基带,便于后续进行数字化处理与目标信息提取。文中提供了完整的MATLAB代码实现,涵盖混频、低通滤波、抽取等核心步骤,帮助读者理解DDC的工作原理与工程实现细节。; 适合人群:具备一定信号与系统、数字信号处理基础知识,从事雷达、通信或电子工程相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于教学演示,加深对数字下变频原理的理解;②作为雷达或通信系统仿真项目的基础模块;③辅助科研人员快速搭建信号处理链路,进行算法验证与性能分析。; 阅读建议:建议结合数字信号处理教材中的混频、奈奎斯特采样及多速率信号处理理论进行学习,动手运行并调试代码,尝试调整参数(如本振频率、滤波器阶数、抽取因子)以观察对输出信号的影响,从而深入掌握DDC的设计要点与实际应用。
福建省福州新区矢量面数据-02坐标-geojson格式.json
福州新区区划面数据,geojson格式,02坐标
量化数据笔记第2篇:外盘期货历史高频tick数据涵盖主流交易所的活跃合约,以逐笔成交记录为主 字段通常包含品种代码、交易所、日期、精确到毫秒的时间戳、成交价格、成交量、持仓量变化,以及盘口买卖一档挂单
量化数据笔记第2篇:外盘期货历史高频tick数据涵盖主流交易所的活跃合约,以逐笔成交记录为主。字段通常包含品种代码、交易所、日期、精确到毫秒的时间戳、成交价格、成交量、持仓量变化,以及盘口买卖一档挂单价与挂单量。数据保留了原始行情序列,反映微观价格变动与流动性瞬时变化。 数据源:CMES金融数据库
【多机器人路径规划】基于优先级规划与Petri网融合的多机器人路径规划框架研究(Matlab代码实现)
内容概要:本文提出了一种基于优先级规划与Petri网融合的多机器人路径规划框架,旨在解决多机器人系统在共享环境中进行路径规划时可能出现的冲突与死锁问题。该方法结合了优先级规划的高效性与Petri网在建模并发与冲突方面的优势,通过建立形式化的Petri网模型对机器人运动状态进行精确描述,并引入优先级机制动态调整路径执行顺序,从而实现无冲突、无死锁的安全路径规划。研究通过Matlab代码实现了算法仿真,验证了该框架在复杂网格环境下的可行性与有效性,能够有效提升多机器人系统的运行效率与安全性。 适合人群:具备一定自动化、机器人或控制理论基础的科研人员,以及从事智能物流、智能制造、多智能体系统等相关方向的研究生与工程技术人员。 使用场景及目标:①应用于仓储机器人、AGV调度、自动化码头等多移动机器人协同作业场景;②解决多机器人路径规划中的死锁预防、冲突消解与资源竞争问题;③为开发高效、可靠的多智能体路径规划系统提供理论支持与实现参考。 阅读建议:此资源以Matlab代码实现为核心,建议读者在理解Petri网基本原理和优先级调度机制的基础上,结合提供的代码进行仿真实验,通过调整优先级规则与网络结构,深入掌握算法的设计思路与优化方法。


Java SE
