Javaee:阻塞队列和生产者消费者模型

文章目录

  • 什么是阻塞队列
  • java中的主要阻塞队列
  • 生产者消费者模型
    • 阻塞队列发挥的作用
      • 解耦合
      • 削峰填谷
  • 模拟实现阻塞队列
    • put方法
    • take方法
    • 生产者消费者模型

什么是阻塞队列

阻塞队列是一种支持阻塞操作的队列,在多线程中实现通线程之间的通信协调的特殊队列

java中的主要阻塞队列

java中的阻塞队列是一个接口BlockingQueue<>

带有实例化类有:

ArrayBlockingQueue(有界队列)
LinkedBlockingQueue(无界队列)
ProrityBlockingQueue(FIFO队列)

阻塞队列不仅继承了队列的所有方法,还提供了带有阻塞效果的put方法和take方法

put(E e):将元素插入队列,如果队列满,则等待直到队列有空间。
take():从队列中取出并移除元素,如果队列为空,则等待直到队列有元素。

特点

线程安全

阻塞特性

队列为空,尝试出队列,出队列操作就会阻塞,阻塞到其他线程添加元素为止

队列为满,尝试进队列,进队列操作也会阻塞,阻塞到其他线程取走元素为止

在这里插入图片描述
以上是线程一往阻塞队列添加元素,线程二从阻塞队列中移除元素

理解有界和无界

有界:在实例化对象的时候,可以在构造方法传参,表示阻塞队列能容纳的最大元素个数
无界:没有设置固定大小的队列,表示可以存储的元素个数范围很大

生产者消费者模型

在这里插入图片描述
阻塞队列是生产者消费者模型的交易场所

举个生活中的例子

包饺子
奶奶负责擀饺子皮,奶奶把饺子皮放到一个容器里,我和妈妈把饺子皮从容器中拿出来包饺子。

饺子皮——>资源

奶奶——>生产者

我和妈妈——>消费者

容器——>交易场所(阻塞队列)

阻塞队列发挥的作用

解耦合

举例
服务器A直接与服务器B进行交互,一旦服务器A中的代码发生改变,服务器B越需要做出相应的改变,也就是他们之间的关联度高,耦合度高
在这里插入图片描述

解耦合——通过阻塞队列

在这里插入图片描述
服务器A不直接与服务器B进行交互,而是通过阻塞队列这个交易场所进行交互,降低了服务器之间的关联度

在生产者消费者模型中的应用

阻塞队列通过充当中间缓存,允许生产者先把数据放入队列,消费者在有空闲时再取出处理,这样就不会因为速度不一致而导致数据丢失或重复处理

削峰填谷

如果服务器A传给B的数据量激增,服务器B没有那么大的接收量,就会瞬间过载

削峰填谷——阻塞队列
在这里插入图片描述

在请求量突然增加的情况下,阻塞队列可以缓冲住大量的生产者请求,避免消费者瞬时过载。
当生产量较小时,消费者可以逐步消费队列中积累的数据,从而实现负载平衡和资源优化。

模拟实现阻塞队列

put方法

public void put(String elem) throws InterruptedException {
        synchronized(locker) {//保证原子性
            // 使用while循环来检查队列是否已满,以处理虚假唤醒和条件变化的情况
            while (size >= data.length) {//if的话会出问题,使用wait需要搭配while进行二次判断,如果唤醒wait之后,size还是为0,那么执行下面的操作就会出问题
               //如果队列已满,则当前线程等待,直到被其他线程唤醒
                locker.wait();//抛一下异常
            }
            data[tail] = elem;
            tail++;
            if (tail >= data.length) {
                tail = 0;//便于理解
                //tail=(tail+1)%data.length;

            }
            size++;
            locker.notify();//说明不为空就去唤醒take的wait
        }
    }

take方法

public String take() throws InterruptedException {
        synchronized (locker) {//保证原子性
            // 使用while循环来检查队列是否为空,以处理虚假唤醒和条件变化的情况
            if (size == 0) {
                locker.wait();// 如果队列为空,则当前线程等待,直到被其他线程唤醒
            }

            String ret = data[head];
            head++;
            if (head >= data.length) {
                head = 0;
            }
            size--;
            // 在取出元素并更新队列状态后,通知其他等待的线程
            locker.notify();//相互唤醒,说明没满,就去唤醒put的wait
            return ret;
        }
    }

生产者消费者模型

Thread producer=new Thread(()->{
            int n=0;
            try {
                while(true){
                    queue.put(n+" ");
                    System.out.println("生产元素"+n);
                    n++;
                }
            } catch (InterruptedException e) {
               throw new RuntimeException(e);
            }
        },"生产者");
        Thread consumer=new Thread(()->{
            while(true){
                String n=null;
                try {
                        n=queue.take();
                        System.out.println("消费元素"+n);
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        Thread consumer2=new Thread(()->{
            while(true){
                String n=null;
                try {
                    n=queue.take();
                    System.out.println("消费元素"+n);
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/905368.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[网络协议篇] UDP协议

文章目录 1. 简介2. 特点3. UDP数据报结构4. 基于UDP的应用层协议5. UDP安全性问题6. 使用udp传输数据的系统就一定不可靠吗&#xff1f;7. 基于UDP的主机探活 python实现 1. 简介 User Datagram Protocol&#xff0c;用户数据报协议&#xff0c;基于IP协议提供面向无连接的网…

使用 three.js 渲染个blender模型

首先需要一个扫描模型&#xff0c;工业上有专门的设备去采集模型的面然后通过建模软件去处理外表面贴图 我们这里取了一个ford汽车的发动机模型 为了让three.js能够使用&#xff0c;使用blender把模型保存为glb格式 为了让页面加载glb模型更快&#xff0c;需要对模型文件进行压…

jade 0919 | 提取自TVBox的直播盒子,频道丰富高清

jade电视直播app覆盖央视全频道和各大卫视&#xff0c;各地地方台也能一网打尽&#xff0c;随时随地看高清电视。各卫视台覆盖广泛&#xff0c;包括浙江电视台、湖南卫视、江苏卫视、东方卫视等全部卫视台&#xff0c;最新内容先一步掌握。拥有广东、北京、风云足球等热播体育频…

Oracle视频基础1.3.2练习

1.3.2 看 Oracle 实例是否启动 ps -ef | grep oracle备份已有的数据库文件到 old 文件夹&#xff0c;用 sample pfile 手动创建新的数据库文件 pfile mkdir old,mv * old,ls,cd old,cp init.ora …/initwilson.ora编辑 pfile&#xff0c;修改 db_name&#xff0c;db_block_siz…

“中信同业+”焕新升级 锚定数字金融新主线,做实金融“五篇大文章”

9月20日&#xff0c;“中信同业”升级发布会及生物多样性债券指数发布在京顺利举办&#xff0c;此次活动以“做强数字金融 服务实体经济”为主题&#xff0c;由中信金控指导&#xff0c;中信银行主办&#xff0c;中信各金融子公司联合承办。来自银行、证券、保险、基金等行业百…

重学SpringBoot3-Spring WebFlux之HttpHandler和HttpServer

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-Spring WebFlux之HttpHandler和HttpServer 1. 什么是响应式编程&#xff1f;2. Project Reactor 概述3. HttpHandler概述3.1 HttpHandler是什么3.2 Http…

全桥PFC电路及MATLAB仿真

一、PFC电路原理概述 PFC全称“Power Factor Correction”&#xff08;功率因数校正&#xff09;&#xff0c;PFC电路即能对功率因数进行校正&#xff0c;或者说是能提高功率因数的电路。是开关电源中很常见的电路。功率因数是用来描述电力系统中有功功率&#xff08;实际使用…

【音视频 | ADPCM】音频编码ADPCM详细介绍及例子

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

python读取视频并转换成gif图片

1. 安装三方库 moviepy 将视频转换成gif&#xff0c;需要使用 moviepy库 确保已经安装了moviepy库 pip install moviepy2. 代码实现&#xff1a; from moviepy.editor import VideoFileClipmyclip VideoFileClip("video.mp4") myclip2 myclip.subclip(0, 10).re…

人工智能原理实验二:搜索方法

一、实验目的 本实验课程是计算机、智能、物联网等专业学生的一门专业课程&#xff0c;通过实验&#xff0c;帮助学生更好地掌握人工智能相关概念、技术、原理、应用等&#xff1b;通过实验提高学生编写实验报告、总结实验结果的能力&#xff1b;使学生对智能程序、智能算法等…

在Centos7.9服务器上使用LVM方式挂载磁盘以及Windows磁盘性能测试与Linux磁盘性能测试命令hdparm详细

一、在Centos7.9服务器上使用LVM方式挂载磁盘 在磁盘分区挂载之前&#xff0c;先使用lsblk命令查看磁盘信息&#xff0c;未分区挂载的磁盘sdb只有disk类型没有part类型。40G的硬盘sda已经分了两个区sda1、sda2。而sdb磁盘下并没有分区信息&#xff0c;说明还没有分区。磁盘分区…

dicom基础:乳腺影像方位信息介绍

目录 一、轴位 (CC, Craniocaudal) 二、侧位 (Lateral) 三、侧斜位 (MLO, Mediolateral Oblique) 四、不同的拍摄方位的乳腺影像展示 1、RCC&#xff08;Right Craniocaudal&#xff09; 2、LCC&#xff08;Left Craniocaudal&#xff09; 3、RMLO&#xff08;Right Medio…

uniapp 报错Invalid Host header

前言 在本地使用 nginx 反向代理 uniapp 时&#xff0c;出现错误 Invalid Host header 错误原因 因项目对 hostname 进行检查&#xff0c;发现 hostname 不是预期的&#xff0c;所以&#xff0c;报错 Invalid Host header 。 解决办法 这样做是处于安全考虑。但&#xff0…

10个领先的增强现实平台【AR】

增强现实 (AR) 被描述为一种通过计算机生成的内容增强现实世界的交互式体验。 使用软件、应用程序和硬件&#xff08;例如 AR 眼镜&#xff09;&#xff0c;AR 能够将数字内容叠加到现实环境和物体上。早在 2024 年&#xff0c;许多像 Apple 这样的公司就已进入 VR/AR 市场&am…

匹配——rabin_karp是怎么滚动的?

滚动散列函数 接前面用例公式滚动last_pos第三行第二行第一行证明后话接前面 匹配——散列法里面只说前一个字符乘以128再对72057594037927931求模,答案乘以128加后一个字符再对72057594037927931求模。对应代码: hash_s = (DOMAIN * hash_s + ord(s[i])) % PRIME用例 还是…

国产数据库之Vastbase海量数据库 G100

海量数据库Vastbase是基于openGauss内核开发的企业级关系型数据库。其语法和Oracle数据库很像&#xff0c;基本是从Oracle数据库迁移到海量数据库&#xff0c;以下简单介绍入门的使用 1、建库操作 地址&#xff1a;x.x.x.x root/Qa2021 安装路径&#xff1a;/home/vastbase 创…

进程、孤儿进程、僵尸进程、fork、wait简介

进程相关概念 程序和进程 程序&#xff1a;是指编译好的二进制文件&#xff0c;在磁盘上&#xff0c;占用磁盘空间, 是一个静态的概念. 进程&#xff1a;一个启动的程序&#xff0c; 进程占用的是系统资源&#xff0c;如&#xff1a;物理内存&#xff0c;CPU&#xff0c;终端等…

【万兴科技-注册_登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

【笔记】数据结构与算法

参考链接&#xff1a;数据结构(全) 参考链接&#xff1a;数据结构与算法学习笔记 一些PPT的整理&#xff0c;思路很不错&#xff0c;主要是理解角度吧&#xff0c;自己干啃书的时候结合一下会比较不错 0.总论 1.数据 注&#xff1a;图是一种数据结构&#xff01;&#xff01;…

匿名内部类的理解

这个知识点困惑我很久&#xff0c;前几天面试的时候也问到了&#xff0c;没回答出来 首先先说说使用步骤吧 1.有一个接口&#xff0c;且含有一个抽象方法&#xff08;通常情况我们不会写abstract关键字&#xff0c;冗余的&#xff09; 2.然后有一个外部类&#xff08;Anonymo…