生产者消费者模式实现

多线程实现生产者与消费者模式 生产者-消费者模式的简介:在实际的软件开发过程中,我们将产生数据的模块称为生产者,处理数据的模块成为消费者。但仅有这两者还不够成为一个生产者-消费者模式,还需要有一个缓冲区(一段内存区域)作为中介,生产者产生的数据放入缓冲区,消费者从缓冲区读取数据并处理。(注:上述所说的模块是广义的,可以是类,函数,线程,进程等)我们可以将这二者之间的关系图表示出来:总结:我们用3-2-1的方法来简单描述一个生产者 阅读详情

生产者与消费者解耦,典型应用:MQ。不多解释,code talking:


调用模块:

package com.array7.ds.pc;

import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;

public class Run {
	public static void main(String[] args) {
		BlockingDeque<Integer> queue = new LinkedBlockingDeque<Integer>(50);
		int stopConditon = 100;
		new Productor(queue).begin(stopConditon);
		new Customer(queue).begin(stopConditon);
		
	}
}


生产者模块:


package com.array7.ds.pc;

import java.util.concurrent.BlockingDeque;
import java.util.concurrent.atomic.AtomicInteger;

public class Productor {
	static AtomicInteger flag = new AtomicInteger(0);
	private BlockingDeque<Integer> queue;

	public Productor(BlockingDeque<Integer> queue) {
		this.queue = queue;
	}

	public void begin(int stopConditon) {
		new Thread(new Create(queue, stopConditon)).start();
	}

	public static class Create implements Runnable {
		private BlockingDeque<Integer> queue;
		private int stopConditon;

		public Create(BlockingDeque<Integer> queue, int stopConditon) {
			this.queue = queue;
			this.stopConditon = stopConditon;
		}

		@Override
		public void run() {
			while (true) {
				try {
					Thread.sleep(5);
					int i = flag.incrementAndGet();
					if (i == stopConditon) {
						queue.put(i);
						System.out.println("stop put element >>> ");
						break;
					}
					queue.put(i);
					System.out.println("put element >>> " + i);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}

	}
}

消费者模块:

package com.array7.ds.pc;

import java.util.concurrent.BlockingDeque;

public class Customer {
	BlockingDeque<Integer> queue;

	public Customer(BlockingDeque<Integer> queue) {
		this.queue = queue;
	}

	public void begin(int stopConditon) {
		new Thread(new Get(queue, stopConditon)).start();
	}

	public static class Get implements Runnable {
		private BlockingDeque<Integer> queue;
		private int stopConditon;

		public Get(BlockingDeque<Integer> queue, int stopConditon) {
			this.queue = queue;
			this.stopConditon = stopConditon;
		}

		@Override
		public void run() {
			while (true) {
				try {

					Thread.sleep(10);
					Integer e = queue.take();
					if (e != null) {
						if (e.intValue() == stopConditon) {
							System.out.println("stop get element >>>>>> ");
							break;
						}
						System.out.println("get element >>>>>> " + e);
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}

	}
}


JS实现生产者消费者模式的理解实例 简要 通过缓存,去中心化,降低耦合度,在这个模型中,最关键就是内存缓冲区为空的时候消费者必须等待,而内存缓冲区满的时候,生产者必须等待,从而达到动态平衡,该实例主要是关注实现这一点 体验网址 http://www.oujin.fun/#/ProPage 效果图 实现思路 1 /*定义全局数组当做缓存仓库*/ var factoryCapacity=new Array(); 2定... 阅读详情

相关推荐

利用数组解决生产者消费者问题

这个程序用来实现生产者消费者,非常巧妙,里面用到math.h头文件的中包含的函数,需要对c语言非常了解。 特别强调一点,由rand()产生的随机数并不是完全随机的而是有一定规律可循的,里面会用到。

生产者消费者模式三种实现方式

1.什么是生产者消费者模式: 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。 这个阻塞队列就是用来给生产者和消费者解耦的。纵观大多数设计模式,都会找一个第三者出来进行解耦,如工厂模式的第三者是工厂类,模板模式的第三者是模板类。在学习一些设计模式的过程中,如果先找到

weixin_38568503的博客 1万+

生产者消费者模式+定时任务demo

主要是自己为了学习与加深生产者消费者模式的理解,写的一个demo,里面还包含一个定时任务,只用了一下spring的框架(也可以不用的)

手把手教你实现 生产者消费者模式

生产者消费者模式是一种并发设计模式,用于解决多线程环境下生产者和消费者之间的协作和数据共享问题。

胤凯的博客 1473

从外包到转正:一个华为OD亲历者的真实工作体验与避坑指南

本文分享了一位华为OD员工从外包到转正的真实经历与实用建议。通过详细解析华为OD的日常工作、转正核心指标、机试备考技巧及职场突围策略,为读者提供了一份全面的避坑指南。特别针对机试E卷的高频考点和刷题方法,给出了具体的数据分析和实战经验。

weixin_33686714的博客 712

Unity 接入HybridCLR的点点滴滴,亲测三平台(PC、Android、WebGL)妥妥的。-问题分享

一入热更深似海啊,没有热更是真恼火啊,干啥啥不方便,动不动就得重新发包;说实在的,也是工作之余研究这个,在原有框架基础上接入这个热更,既要保持原有功能,还要支持热更,实实在在、断断续续搞了这么久,终于是接入并测通了,这一路是坎坎坷坷,下面把走过的弯弯绕绕记录下,希望对后来想接入的小伙伴有帮助吧。

GarFe的博客 1万+

一看就懂系列之 php中的生产者and消费者模式

前言在工作中常常听到某某大牛之间的交谈会涉及到,xx消费者啊啥的,到底什么大牛之间讲的是什么? 这篇文章主要解决三个问题: 1.到底什么是生产者和消费者,以及它们之间的故事 2.它们之间靠什么交流 3.应用场景正文一、什么是生产者和消费者,以及它们之间的故事在实际的程序开发中,会经常碰到这样的情况:小a模块负责生产数据,这些数据由另外一个模块负责处理。产生数据的模块,就形象地称为生产者;而处

咖啡色的羊驼 5974

SOPHGO SG2000/SG2002 AI SoC异构架构解析与应用

异构计算架构通过整合不同指令集核心(如RISC-V、Arm和8051)实现性能与功耗的平衡,是现代嵌入式系统和AIoT设备的关键技术。其原理是根据任务特性分配至最适合的计算单元,例如通用计算使用高性能核心,实时任务交由专用核心处理。这种架构在智能视觉、工业检测等场景具有显著优势,能高效处理AI推理、多媒体编解码等任务。SOPHGO SG2000系列SoC采用创新的三核异构设计,集成了0.5-1TOPS的NPU加速器,支持Linux/Android/FreeRTOS多系统并行运行。开发中需注意核心间的IPC通

weixin_30684743的博客 356

php 生产者-消费者实现

php 通过redis实现生产者-消费者

java_csdnn的博客 1156

-如何搭建聚合支付系统

聚合支付市场分析 移动支付已经越来越大众化,其中使用人群集中的两种支付不外就是微支付,支付宝支付!  很多线下都是整合了微支付与支付宝支付;很多消费者到店消费问的第一件事情就是可不可以微信支付,或者支付宝支付  可以说移动支付是未来的一个大趋势;现在人们出门基本上都不用带现金了,可以说是一机在手走遍天下都不怕 可以说现在移动支付是一个趋势! 原本刚刚出来的时候,支付宝是一个支付码,微支付

q744803399的博客 3197

嵌入式状态机编程-QP状态机框架与常见状态机方法

状态机基本术语 现态:是指当前所处的状态。 条件:又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。 次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。 传统有限状态机Fsm实现方法 如图,是一个定时计数器,计数器存在两种状态,一种为设置状态,一种为计时状态 设

qq_36969440的博客 9667

实现生产者消费者模式的三种方式

什么是生产者消费者模式 简单来说,生产者消费者模式就是缓冲区。 那么这么做有两个好处,一个是解耦,第二个是平衡生产能力和消费能力的差,因为生产者和消费者的速度是不一样的,有了这个缓冲区就可以平衡这样一个落差,达到动态平衡。 那么这个缓冲区其实就是一个队列,它的规则就是当队列是满的时候,生产者会被阻塞。当队列为空的时候,消费者会被阻塞, 在java中实现生产者消费者模式有多种方式,主要是线程间的通信,这里介绍三种:wait/notify、await/signal和阻塞队列。 wait/notify wait

a779868946的博客 677

专栏二十:如何选择你的单细胞亚群的分辨率--ROGUE

ROGUE这是继chooseR后第二个计算单细胞亚群分辨率的内容,其实关于代码的运行很简单,网上已经有不少教程,重复这些就没意思了,这里主要是结合探讨一下这个算法。

m0_58549466的博客 981

Java实现生产者和消费者模式

从生产者、消费者模型会出现的问题出发,谈了一下对生产者、消费者模型的理解,并配有完整的代码实现。

扬帆向海的博客 1万+

华为OD机试 - 去除多余空格(Python/JS/C/C++ 2024 E卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。去除文本多余空格,但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标,去除多余空格后刷新关键词的起始和结束下标。条件约束:输入为两行字符串:第一行:待去除多余空格的文本,用例保证如果有单引号,则单引号成对出现,且单引号可能有多对。 第二

学Java,找哪吒 1217

自适应控制 (Adaptive Control) 算法详解及案例分析

自适应控制是一种能够在线调整控制器参数以适应系统动态变化的控制方法。其核心思想是通过实时估计系统参数或调整控制器参数,使系统在不确定性或动态变化的环境中仍能保持稳定性和性能。

闲人编程的博客 4086

多线程-生产者和消费者模式的四种实现

什么是生产者和消费者模式: 生产者和消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此并不直接通信,而是通过阻塞队列进行通信,所以生产者生产完数据后不用等待消费者进行处理,而是直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列中获取数据,阻塞队列就相当于一个缓冲区,平衡生产者和消费者的处理能力。 wait/notify和synchronized配合实现: 生产者...

Fly_Fly_Zhang的博客 7204

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

BlockingCollection实现生产者消费者模式

说明:只有调用collection.CompleteAdding(),且collection为空时,consumerTask才可能终止;否则,因为collection.GetConsumingEnumerable()的无限迭代,consumerTask将无法终止。如果某线程确定需要持续后台运行,则可不调用collection.CompleteAdding()。如上代码,在生产者完成添加后,主动调用 CompleteAdding(),当消费者消费所有内容后,则会自动退出。

SQWH_SSGS的博客 1129

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java使用LinkedBlockingQueue实现 生产者 消费者模式

LinkedBlockingQueue LinkedBlockingQueue实现是线程安全的,实现了FIFO(先进先出)等特性. 是作为生产者消费者的首选,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时

韩鹏程的专栏 9850

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【Java】使用BlockingQueue实现生产者-消费者模式

简介 生产者-消费者模式是一个经典的多线程设计模式。在生产者-消费者模式中。通常有多个生产者线程和多个消费者模式,生产者线程负责提交用户请求,消费者线程负责具体处理生产者提交的任务。两者之间通过共享内存缓冲区进行通信。 生产者-消费者模式的核心组件是共享内存缓冲区,它的作用是生产者与消费者之间的通信桥梁,避免二者之间的直接通信,有效地降低了二者耦合性。生产者不需要知道消费者的存在,消费者也不需要知...

makersy的博客 2913

有哪几种实现生产者消费者模式的方法?

有哪几种实现生产者消费者模式的方法?

哀莫大于心死 660

生产者消费者_【Java面试】实现生产者消费者模式

使用 BlockingQueue 实现生产者消费者模式 publicclassProducerConsumerModel2{privatestaticBlockingQueuequeue=newArrayBlockingQueue<>(5);publicstaticvoidmain(String[]args)throwsInterrupt...

weixin_39640157的博客 76

Java实现生产者-消费者模式

Java实现生产者-消费者模式 1. 什么是生产者-消费者模式 生产者-消费者模式主要三种对象:生产者、消费者、队列。有一些生产者,每个生产者会生产一些产品,将它们放到队列中。这些产品会被消费者从队列中取出使用。队列存在最大长度,当队列满时,生产者需要等待消费者消费后才能继续将生产的产品放入队列中,当队列为空时,消费者需要等待生产者将新的产品放入队列才能继续消费产品。 2. 准备工作 我们可以把每个生产者和消费者看成一个线程,并且假设队列实现了如下的接口 队列接口 public interface IBlo

jsc723的专栏 632
上一篇: Ping CAP CTO、Codis作者谈redis分布式解决方案和分布式KV存储
下一篇: 互联网秒杀设计
七郎
博客等级 码龄14年 31粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值