生产者消费者模式

生产者-消费者模式 我们可以在生产者和消费者之间加一个阻塞队列(也可以是用阻塞队列实现的程序,或者是部署了阻塞队列的服务器),让生产者和消费者通过队列来进行通信,消费者把请求发送到队列里,消费者从队列中拿生产者发送的数据,生产者从队列中获取请求,把返回的响应发送到队列里。有的时候生产者生产数据的速度远远大于消费者取数据的速度,那么队列满的时候,生产者就进入阻塞状态,生产不了数据,等消费者取数据的时候才能从阻塞状态解除,继续去生产数据。在队列空的时候,出队列操作对进入阻塞,等队列不空的时候再解除阻塞,继续出队列。 阅读详情

注:一个生产者,一个消费者。

1.测试类

/**
 * 生产者消费者模式
 * 有两个角色,生产者和消费者
 * 生产者负责生产,消费者负责消费
 * 生产者生产的商品,交给消费者来消费,商品数据在生产者和消费者之间共享
 * 商品数量不能为负数,商品需要有地方来保存(比如仓库),所以商品数量还应该有上限(商品数量最多不能超过某个数)
 * 当商品数量为0时,消费者不能继续消费
 * 当商品数量达到上限时,生产者不能继续生产
 */
public class Test {
    public static void main(String[] args) {
        Factory f = new Factory();
        Runnable worker = new Worker(f);
        Runnable customer = new Customer(f);

        new Thread(worker,"a").start();
        new Thread(customer,"b").start();
    }
}

2.Facroty(仓库)

/**
 * 仓库,用来保存商品
 */
public class Factory {

    private Integer num = 10;//商品数量

    /**
     * 生产的方法
     */
    public synchronized void enterProduct(){
        //如果商品数量大于等于10个,就不允许再生产了
        if(num>=10){
            System.out.println("商品数量过多,不能再生产了");
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        num++;
        System.out.println("生产了一个商品,现在的商品数量:"+num);
        this.notify();
        //this.notifyAll();
    }


    /**
     * 消费的方法
     */
    public synchronized void outProduct(){
        //当商品数量为0时,消费者不能继续消费
        if(num<=0){
            System.out.println("没有商品了,现在不能消费了");
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        num--;
        System.out.println("消费了一个商品,现在的商品数量:"+num);
        this.notify();
    }
}

3.生产者:

public class Worker implements Runnable {

    private Factory factory;

    public Worker(Factory factory){
        this.factory = factory;
    }

    @Override
    public void run() {
        while(true){
            //不断生产
            factory.enterProduct();
        }
    }

}

4.消费者:

public class Customer implements Runnable {

    private Factory factory;

    public Customer(Factory factory) {
        this.factory = factory;
    }

    @Override
    public void run() {
        while(true){
            factory.outProduct();
        }
    }

}

这里写图片描述

生产者消费者模式,BlockingCollection 生产者消费者模式可以让生产者和消费者互不干扰,且有个缓存区解。 生产者把数据放入缓冲区,而消费者从缓冲区取出数据,不必生产一个才能消费一个,消费完一个才能生产下一个。 class Program { static void Main(string[] args) { Task.Factory.StartNew(() =&g... 阅读详情

相关推荐

WinForm多语言切换实战:5分钟搞定中英文界面(附完整代码)

本文提供了WinForm应用实现中英文界面切换的两种高效实战方案。通过利用内置的本地化机制和资源文件,开发者可以在5分钟内为窗体添加多语言支持,并附有完整代码示例,帮助快速应对软件国际化需求。

weixin_29230773的博客 406

生产者消费者模型

生产者消费者模型 一、介绍: (一)、概念:         如果要实现以下操作流程,使用Java代码来实现:  多个蛋糕师生产蛋糕,多个消费者购买蛋糕;  蛋糕的最大库存为5个;  早生产的蛋糕先被销售,最后被生产的蛋糕要最后被售出          如果要实现这个过程,一定要借助Java线程的并发协作来做。其实这在Java中叫做生产者消费者

ElevenDGQ的博客 1373

使用模拟工具Modbus poll 和PLC 通讯

使用模拟工具Modbus poll 和PLC 通讯 简介 Modbus Poll 是一个模拟Modbus 主站的工具。不用在现场调试,在家也能使用,方便快捷的调试验证程序。使用它可以和PLC进行Modbus TCP /RTU 通讯等功能,接下来为大家介绍使用Modbus Poll 和 PLC 进行 Modbus TCP 通讯。 组态PLC PLC作为我们的从站和Modbus Poll 通讯,那我们组态一个PLC。 创建通信DB 创建一个DB块,在数据类型处输入:TCON_IP_V4

weixin_61398412的博客 1万+

手写一个生产者--消费者模型例子

在并发编程中,比较经典的编程例子就是生产者和消费者模型。下面就是一个例子来诠释一下什么是生产者和消费者以及他们的特点和注意点。1、先定义一个数据对象,public class Data { private String id; private String name; public Data(String id,String name){ this.id = id

8098

cocos creator接入微信登陆sdk ios篇

cocos creator接入微信登陆sdk ios篇 背景已经在Android篇里面交代过了,有兴趣的朋友可以再看看Android篇 步骤 去微信开放平台下载ios平台所需要的sdk 在“info”标签栏的“URL type“添加“URL scheme”为你所注册的应用程序id 在“info”标签栏的“LSApplicationQueriesSchemes“添加weixin 将SDK文件中...

凤小鹿的博客 6362

二阶系统的带宽(频域分析)

下面以典型I型系统为例,计算系统的开环截止频率和闭环截止频率。设I型系统为: 1:系统的开环截止频率为 2:系统的闭环截止频率 其实我们在工程整定时,把ζ = 0.707,也把系统的带宽近视看成自然震荡角频率即 (wb≈wc≈wnw_{b}\approx w_{c}\approx w_{n}wb​≈wc​≈wn​)对于二阶系统。 ...

wanrenqi的博客 2万+

java设计模式之生产者/消费者模式

什么是生产者/消费者模式? 某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。在生产者与消费者之间在加个缓冲区,我们形象的称之为仓库,生产者负责往仓库了进商品,而消费者负责从仓库里拿商品,这就构成了生产者消费者模式。结构图如下: 生产者消费者模式有如下几个优点: 1...

weixin_30384217的博客 457

瑞芯微RV1126部署YOLOv8全流程:环境搭建、pt-onnx-rknn模型转换、C++推理代码、错误解决、优化、交叉编译第三方库

瑞芯微RV1126部署YOLOv8全流程:环境搭建、pt-onnx-rknn模型转换、C++推理代码、错误解决、优化、交叉编译第三方库

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 3105

生产者与消费者 模型理解,与简单设计

题外话:从中秋请假到现在,接近20天的假期,让我彻底耍晕了,现在来写代码,发现始终没进入状态。以后建议大家没特殊事情,还是别请这么久啦,分开耍,有利于放松,也不至于耍得忘乎所以。我是一直想做互联网 并发 大数据方面的工作,有兴趣才有动力嘛,企业开发感觉活力不强,太多重复的劳动,还是喜欢研究 解决问题,有挑战的东东。线程这块,生产者与消费者模型一直是很经典的东东,这里我用自己的理解分享一下,有误...

Hello World 676

【maven】idea左侧External Libraries里,没有Maven的依赖包 代码飘红

文章目录1.概述M.参考 1.概述 因为内网开发,然后这几天我被隔离了,然后公司搞了一个外网的vpn能连接的云桌面,云桌面也是网络隔离的,因此只能自己拷贝相关的文件到里面。 然后我就拷贝了代码和maven仓库中的一部分,因为本地的20G一次拷贝不完,需要多次拷贝,但是我拷贝了kafka,仍然飘红。具体如下 idea左侧External Libraries里,没有Maven的依赖包 然后整了很久都没搞定,后来我自己新建了一个项目,然后引入发现是不可以的,而且框框里面的飘红。 然后我就想是不是因为缺少依赖

九师兄 4411

抖音移动端Web用户主页视频列表爬虫实战:逆向加密参数与高频采集方案

App端Hook/抓包:需要安卓逆向、Xposed或Frida,门槛高且容易被风控。官方开放API:限制极多,几乎不开放用户级视频列表。PC端Web:页面加载方式繁杂,且大量依赖懒加载与内部状态。移动端Web(:接口相对稳定,加密逻辑集中,且适合使用Requests/HTTPSession模拟,无需渲染引擎。本文聚焦于移动端Web下的用户主页视频列表爬取,采用Python 3.11 + httpx + PyExecJS + 正则/JSON解析的组合,破解X-Bogus签名和_signature。

2201_76125261的博客 845

Java线程:并发协作-生产者消费者模型

Java线程:并发协作-生产者消费者模型   对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的。就像学习每一门编程语言一样,Hello World!都是最经典的例子。   实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了。 对于此模型,应该明确一下几点: 1、生产者仅仅在仓储未满时候生产,仓满则停止生产。 2、消费者...

weixin_33800593的博客 187

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

weixin_38568503的博客 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

设计模式——生产者消费者模式

1 基本概括 2 主要介绍 2.1 概念 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力 这个阻塞队列就是用来给生产者和消费者解耦的。 如果缓冲区已经满了,则生产者线程阻塞; 如果缓冲区为空,那么消费者线程阻塞。 2.2 生产消费者模型 就是在一

qq_20761351的博客 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

简单的消费者生产者模式

消费者生产者模式,就是在一个系统中,存在消费者生产者两种角色,他们通过缓冲区进行通信,生产者生产消费者所需的资料,消费者把资料制作成产品或使用 下面讲用一个简单的例子模拟生产者消费者模式 创建一个仓库类 import java.util.LinkedList; public class MyStorage { LinkedList<Object> list = new L...

weixin_43951020的博客 689

设计模式-生产者与消费者模式

最近正在看C++日志的开源代码,其中多个线程需要向文件中写入日志信息,该将该算法逻辑抽象出来的话就是生产者与消费者设计模式。常见的生产者与消费者模式主要分为四类:单生产者与单消费者模式、单生产者与多消费者模式、多生产者与单消费者模式以及多生产者与多消费这模式。下面将以此对上述的四种生产者与消费者模式进行分析。 1 单生产者与单消费者模式 在讲设计模式之前,需要明确什么是PV操作。PV操作是在多线程之间实现互斥与同步的算法。P操作(wait)是指只有当信号量大于等于0的时候...

oreo的博客 2975

设计模式之生产者消费者模式

本文通过`wait()`和`notify()`方法,实现和分析消费者和生产者模式,此模式优雅的实现了生产者和消费者的解耦,并且支持并发。通过手写一份生产者消费者模式的代码,进行讲解。学习领悟了这种设计模式,才可以真正理解`消息中间件`实现的底层思想,比如Kafka、RocketMQ、RabbitMQ等。

五道口 2866

java 生产者消费者模式

java的生产者消费者模式,有三个部分组成,一个是生产者,一个是消费者,一个是缓存。 这么做有什么好处呢? 1.解耦(去依赖),如果是消费者直接调用生产者,那如果生产者的代码变动了,消费者的代码也需要随之变动 2.高效,如果消费者直接掉生产者,执行时间较长的话,会阻塞,影响其他业务的进行 3.负载均衡,如果消费者直接调生产者,那生产者和消费者就得在一起了,日后业务量非常大的话,要想减轻服务器...

卖克的专栏 1万+

生产者与消费者模式

所谓生产者与消费者模式就是通过平衡生产线程与消费线程的工作能力来提高程序整体处理数据的速度… 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完才能继续生产数据,反之亦然,为了解决这种生产消费能力不均衡的问题,便有了生产者消费者模式。 下面先从一个简单的例子入手: package multithread;...

无意呢的博客 951

并行模式之生产者消费者

原理 生产者-消费者模式是一个经典的多线程设计模式,它为多线程的协作提供了良好的解决方案。在生产者-消费者模式中,通常有两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费者线程负责处理用户请求。生产者和消费者之间通过共享内存缓冲区进行通信。 生产者和消费者分开,互相不用关系 学到的只是启蒙思想,如何使用,就看大家了 实现 定义一个队列 生产者和消费...

西魏陶渊明的博客 662

生产者消费者设计模式

转载:https://www.jianshu.com/p/71a5089afe13 场景 生产者生产数据,消费者消费数据; 但是性能处理速度均有差异,因而需要一个中间队列协调; 举例 3个厨师做甜点,有3个吃货来吃,如果厨师和吃货一对一,厨师的生产速度和吃货的吃饭速度均成成了短板,可能存在这样一种不协调的场景; 慢性子厨师款待一个吃饭快的胖吃货,吃货都要饿死了,只能死等; 急...

qq_33366098的博客 1076

Java 生产者消费者模式介绍

的基本线程数就把任务扔到阻塞队列里,这种做法比只使用一个阻塞队列来实现生产者和消费者模式显然要高明很多,因为消费者能够处理直接就处理掉了,这样速度更快,而生产者先存,消。来处理不同性质的任务,比如线程池1将数据读到内存之后,交给线程池2里的线程继续处理压缩。在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一。要继续处理,于是消费者处理完数据之后,它又要作为生产者把数据放在新的队列里,交给其他。

yzwfeng的专栏 609
上一篇: 阻塞双端消息队列 BlockingDeque(先进先出的原则管理)
下一篇: android中图片的处理(绘制圆形,圆角||缩略图)
Allen-华
博客等级 码龄11年 10粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值