生产者消费者模型

生产者/消费者模型 生产者消费者模式是通过一个容器来解决生产者和消费者之间强耦合的关系。生产者和消费者彼此之间不直接通讯,而是通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者进行消费,而是先存到阻塞队列中。消费者不直接找生产者要数据,而是从阻塞队列中拿数据。阻塞队列就相当于一个缓冲区,将生产者和消费者之间进行解耦。 如果有多个生产者或者多个消费者那么他们之间的关系如下:下面来简单实现一下生产者和消费者模型这里是使用阻塞队列来作为生产者和消费者的“交易场所”。因此需要先创建一个类。由于其可能存放的各种类型的数据或者 阅读详情
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;

@SuppressWarnings("all")
/**
 * 描述:
 *
 * @Author (fei)
 * @Date $(DATE)
 */
class Producer1 implements Runnable{
    private HashMap<Integer,Bank6> hashMap;

    public Producer1(HashMap<Integer,Bank6> hashMap) {
        this.hashMap = hashMap;
    }

    @Override
    public void run() {
        while(true) {
            producer1();
        }
    }

    public void producer1() {
        for(int i =1;i<=6;i++) {
            if(i == 6) {
                i = 1;
            }
            Bank6 bank6 = hashMap.get(i);
            synchronized (bank6) {
                try {
                    if(bank6.getIndex() == 1) {
                        System.out.println("producer wait...");
                        bank6.wait();
                        i++;
                        continue;
                    }
                    /*while (bank6.getIndex() == 1) {
                        System.out.println("producer"+ i +" wait...");
                        bank6.wait();
                    }*/
                    Random random = new Random();
                    int n = random.nextInt(10);
                    bank6.setData(n);
                    //打印数据
                    System.out.println("produce data is :" + bank6.getData());
                    //index + 1
                    bank6.setIndex(bank6.getIndex() + 1);
                    //通知消费者
                    bank6.notify();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

class Consumer1 implements Runnable{
    private HashMap<Integer,Bank6> hashMap;

    public Consumer1(HashMap<Integer,Bank6> hashMap) {
        this.hashMap = hashMap;
    }

    @Override
    public void run() {
        while(true) {
            consumer1();
        }
    }

    public void consumer1() {
        for(int i =1;i<=6;i++) {
            if(i == 6) {
                i = 1;
            }
            Bank6 bank6 = hashMap.get(i);
            synchronized (bank6) {
                try {
                    if(bank6.isEmpty()) {
                        System.out.println("consumer wait...");
                        bank6.wait();
                        i++;
                        continue;
                    }

                    //print data
                    System.out.println("consumer consum: " + bank6.getData());
                    //index - 1
                    bank6.setIndex(bank6.getIndex()-1);
                    //inform producer
                    bank6.notify();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }


}

class Bank6 {
    private int data;

    private String name;

    private int index;

    public Bank6(String name) {
        this.name = name;
    }

    public boolean isEmpty() {
        return this.index == 0;
    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class ProCon6Bank {
    public static void main(String[] args) {
        HashMap<Integer,Bank6> hashMap = new HashMap<>();
        for(int i=1;i<=6;i++) {
            Bank6 bank6 = new Bank6("bank"+i);
            hashMap.put(i,bank6);
            System.out.println(hashMap.get(i).getName());
        }
        Thread producer1 = new Thread(new Producer1(hashMap));
        Thread consumer1 = new Thread(new Consumer1(hashMap));

        producer1.start();
        consumer1.start();
    }
}
Win11网络卡顿?用Wireshark抓包5分钟定位问题(保姆级实战) 本文详细介绍了如何使用Wireshark在Win11系统中快速定位网络卡顿问题。通过5分钟抓包分析,作者成功发现TCP重传率高达37%的罪魁祸首,并提供了从准备工作到实战分析的保姆级教程,帮助用户解决游戏卡顿、视频会议延迟等常见网络问题。 阅读详情

相关推荐

IMU数据处理避坑指南:从理论到实践的加速度计重力消除方案

本文详细解析了IMU数据处理中的重力消除技术,从理论基础到实践应用,涵盖了加速度计和陀螺仪的核心问题。通过ROS2实战案例,介绍了静态标定与动态校准的技术对比,以及多传感器融合的进阶策略,帮助开发者避免常见陷阱,提升IMU数据处理的精度和效率。

purple的博客 741

C++实现生产者和消费者模型

C++实现生产者和消费者模型 C++实现生产者和消费者模型1、实现细节1、单生产者-单消费者模型参考 C++实现生产者和消费者模型 1、实现细节 具体的实现逻辑是构建一个queue来存储生产的数据,queue不满时可以生产,不空时可以消费。 对于这个队列,采用阻塞队列的实现思路。 先实现构造函数,初始化一个unique_lock供condition_variable使用。 如何在类里面使用unique_lock等需要初始化,并且初始化会加锁的对象。这要研究下。我的理解是构造列表初始化,然后函数体里unl

JMW1407的博客 1万+

逆向解析抖音核心校验参数:bd-ticket-guard-client-data的Python生成逻辑

本文深入解析了抖音核心校验参数bd-ticket-guard-client-data的生成逻辑,详细介绍了其动态证书生成、非对称加密机制及Python实现方法。通过逆向分析,揭示了抖音安全体系的双层验证机制,包括RSA密钥对生成、证书签名及时间戳校验等关键技术要点,为开发者提供了一套完整的参数生成解决方案。

weixin_26642481的博客 416

Linux生产者消费者模型

文章目录生产者消费者模型为何要使用生产者消费者模型生产者消费者模型优点基于BlockingQueue的生产者消费者模型C++queue模拟阻塞队列的生产消费模型POSIX信号量POSIX信号量函数基于环形队列的生产消费模型 生产者消费者模型 为何要使用生产者消费者模型 生产者消费者模型优点 基于BlockingQueue的生产者消费者模型 C++queue模拟阻塞队列的生产消费模型 POSIX信号量 POSIX信号量函数 基于环形队列的生产消费模型 ...

2021dragon的博客 1万+

电路课设-音响分频器电路设计

(一)题目简介 1.一阶分频器电路设计 假定高音和低音扬声器均等效为 16 欧姆电阻,设计如图 2 的简单分频器电 路,要求高低频分界(两个滤波器的截止频率)为 5kHz。 1) 写出高音扬声器和低音扬声器电压对于 vs 的传递函数,确定电路中电 容 C 和电感 L 的元件值;2)利用 AC 频率扫描分析求出两个扬声器电压的频率响应曲线,验证计算 结果。用包含高低频成分的电压 vs 激励进行测量验证。 3)计算并利用 EWB 仿真证明从 vs 看进去的阻抗为一常数 16 欧姆。

weixin_53507617的博客 1万+

第一章、isaacsim 及 isaaclab 安装教程

本专栏所有内容将根据上述资源地址展开,请结合食用~

m0_47719040的博客 4783

linux:生产者消费者模型

本文是对于生产者消费者模型的知识总结以上就是我对于线程同步的总结。

li209779的博客 2765

RK3588更新NPU驱动的方法

想要在 RK3588 上跑一下 deepseek 的大模型,发现目前的内核提供的 NPU 驱动比较低,无法支持新的大模型,所以需要更新一下我们的 NPU 驱动本次更新的NPU驱动仅适用于RK3588和RK3676系列。

荻夜的博客 2152

【Linux】生产者消费者模型

🍁 🍃 🍂 🌿。

m0_60338933的博客 1903

AI绘画与医疗可视化:用AI生成医学插图的实践

医疗可视化是医学教育、临床沟通和学术研究的核心工具。传统医学插图依赖手工绘制或专业3D建模,存在制作周期长、成本高、更新迭代慢等问题。随着深度学习技术的发展,AI绘画工具(如Stable Diffusion、DALL-E)展现出强大的图像生成能力,但医疗领域对插图的解剖准确性、标注规范性和语义完整性有极高要求,通用AI模型难以直接应用。本文聚焦AI技术与医疗领域的交叉创新,系统阐述如何通过数据预处理、模型定制化训练和后处理校验,构建符合医疗标准的插图生成系统。

大模型应用工坊 1788

MoveIt 运动学、运动规划、混合规划、move_group

混合规划是运动规划方法的一个术语,它将异构运动规划器结合起来,以产生更稳健或反应更快的解决方案。这种通用方法在导航领域已经非常成熟,并在导航2等流行项目中成功实施。MoveIt 的混合规划架构结合了一对全局规划器和局部规划器,它们以不同的规划速度和问题范围并行、并发运行。全局规划器的任务是解决全局运动规划问题,这与 “感知-规划-行动 ”应用中使用的规划器非常相似。所使用的规划器算法应该是完整的,因此假定其计算时间相对较慢。此外,全局规划器不要求实时安全,这意味着无法保证规划器在特定期限内找到解决方案。

机器人控制与仿真应用 2132

生产者消费者模型详解

生产者消费者模型 文章目录生产者消费者模型什么是生产者消费者模型基于BlockingQueue的生产者消费者模型单生产者单消费者模型多生产者多消费者模型 什么是生产者消费者模型 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者

小赵小赵福星高照的博客 9639

matlab从无到有系列(九):Simulink基础仿真详解(全网最全,从入门到放弃)

🔗 运行环境:Matlab 🚩 作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 📚 选自专栏:《数学建模》 🧿 优秀专栏:《Matlab神经网络案例分析》 目前持续更新的专栏: 🥇 专栏:Matlab GUI编程技巧 🔥 专栏:Matlab从无到有系列 📚 专栏:《数学建模》 💗 大家好,我是左手の明天!💗 📆 最近更新:2022 年 4 月 2 日,左手の明天的第215 篇原创博客 🌟🌟往期必看🌟🌟 matlab从无到有系列(二):矩阵运算基础...

左手の明天的博客 9万+

【Linux】生产者 消费者模型

针对上述情况,将if判断改为while循环,每一次被唤醒都要被检测,只有当队列真的是不满的情况,才会进行push。发生休眠实际上就是线程切换,当线程从休眠状态被唤醒时,因为是从临界区被切走的,所以继续从临界区内部执行。供货商可以集中生产的一大批的商品 放到超市中,让消费者随时随地来买,供货商就不生产了。如:若超市火腿肠满了,就应该让消费者先消费,若超市没有火腿肠了,就应该让生产者先生产。若队列中没有数据存在,则不该让消费者消费,若队列中数据满了,不该让生产者进行生产。

qq_62939852的博客 1038

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【Linux —— 生产者消费者模型】

生产者消费者模型是一种并发编程模型,用于解决多线程或多进程间的数据共享和同步问题。生产者和消费者,它们通过共享的缓冲区进行通信。生产者负责生成数据并将其放入缓冲区,而消费者则从缓冲区中获取数据并进行处理。生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而共享的缓冲区进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给缓冲区,消费者不找生产者要数据,而是直接从缓冲区取,平衡了生产者和消费者的处理能力。这个缓冲区就是用来给生产者和消费者解耦的。

jokr_的博客 1279

Camera2Demo

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

Python生产者消费者模型

生产者消费者模型是一种解耦模型,生产者和消费者在不同的时间段内共用同一个存储空间。当生产者生产数据时,消费者可以同时从缓冲区中取出数据进行消费。这样,生产者和消费者之间相互解耦,不需要关心对方的存在,实现了高效的资源利用和并发处理。

一只程序猿子的博客 1880

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java的生产者消费者模型

前言 学完了线程后,我又去找了一些线程相关的练习题来练手,其中印象最深的就是生产者消费者模型这一块,为什么呢,因为它每一篇练习题里都有,开始没看懂,后面就去仔细研究了一下,哦,原来是这样,好像是懂了,那就来写写博客吧。哈哈哈…… 什么是生产者消费者模型 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲

Andy-ZhangSir的博客 1695

生产者-消费者模型

什么是生产者消费者模型 生产者 - 消费者模型( Producer-consumer problem) 是一个非常经典的多线程并发协作的模型,在分布式系统里非常常见。 这个模型由两类线程和一个缓冲区组成来组成 生产者线程:生产数据,并把数据放在这个队列里面 缓冲区:存放生产者的数据的地方 消费者线程:从队列里面取数据,消费数据 运行流程 生产者和消费者在同一时间段内共用同一个存储空间 生产者往存储空间中添加产品 消费者从存储空间中取走产品 当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞。

张三李四王五老六 9044
上一篇: (三)Redi缓存配置,持久化,订阅发布,主从复制和缓存相关问题以及解决
下一篇: Stream流和函数式编程
Java-fly
博客等级 码龄9年 13粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值