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的waitreturn 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);}}});

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis特性和应用场景以及安装

目录 Redis特性 1.数据在内存中存储 2.可编程性 3.可拓展性 4.集群 5.高可用 6.持久化 7.主从复制 8.速度快 Redis的应用场景 1.用作数据库 2.用作缓存或保存会话 3.用作消息队列 Redis 不可以做什么 Redis的安装 Redis特性 Redis 之所以受到如此多公司的⻘睐…

如何在VMware中安全地恢复已删除的快照?

在VMware中是否可以恢复已删除的快照&#xff1f; 答案是肯定的&#xff0c;您有几种方法可以尝试恢复被删除的快照文件&#xff1a; 仅删除了快照描述符文件&#xff08;如VMname-000000#.vmdk&#xff09;&#xff1a;这种情况下&#xff0c;可以手动重新创建描述符文件&…

强化学习DQN实践(gymnasium+pytorch)

Pytorch官方教程中有强化学习教程&#xff0c;但是很多中文翻译都太老了&#xff0c;里面的代码也不能跑了 这篇blog按照官方最新教程实现&#xff0c;并加入了一些个人理解 工具 gymnasium&#xff1a;由gym升级而来&#xff0c;官方定义&#xff1a;An API standard for rei…

ubuntu22.04安装向日葵

1、下载deb安装包 进入官网下载图形版本&#xff1a;https://sunlogin.oray.com/download/linux?typepersonal 2、命令行安装 sudo chmod x 文件名.deb sudo dpkg -i 文件名.deb 3、开始报错的看这里&#xff01; 首先展示一下安装成功的效果图&#xff1a; 接下来是我安…

Vuestic 数据表格 使用demo

<template><br><div class"grid sm:grid-cols-3 gap-6 mb-6"><VaButton click"()>{for(const it in this.selectedItems){console.log(this.selectedItems);}}">参数设置</VaButton><VaButton>参数刷新</VaButt…

深入了解 美国高防 CN2 :如何提升全球化业务的网络安全与性能

美国高防 CN2 的重要性 在跨国企业和全球化业务的不断扩展下&#xff0c;对高性能和安全的网络连接需求不断增加。美国高防 CN2&#xff08;Global Internet Access&#xff09;以其卓越的跨境传输效率和强大的防护能力&#xff0c;成为许多企业关注的焦点。尤其是对电商、游戏…

NVR批量管理软件/平台EasyNVR多个NVR同时管理支持视频投放在电视墙上

在当今智能化、数字化的时代&#xff0c;视频监控已经成为各行各业不可或缺的一部分&#xff0c;无论是公共安全、交通管理、企业监控还是智慧城市建设&#xff0c;都离不开高效、稳定的视频监控系统的支持。而在这些应用场景中&#xff0c;将监控视频实时投放到大屏幕电视墙上…

新材料产业数据管理:KPaaS平台的创新驱动

近日&#xff0c;工业和信息化部、财政部、国家数据局联合印发《新材料大数据中心总体建设方案》&#xff08;以下简称《建设方案》&#xff09;&#xff0c;为新材料产业的发展注入了强大动力。该方案规划清晰&#xff0c;目标明确&#xff0c;旨在充分发挥大数据、人工智能对…

AI代币是什么?AI与Web3结合的未来方向在哪里?

近两年随着人工智能的崛起&#xff0c;AI已经渗透到制造业、电商、广告、医药等各个行业&#xff0c;加密货币领域也不例外&#xff0c;人工智能与区块链的融合&#xff0c;让我们看到了独特的数字资产 — AI加密代币。 它的流行始于2022年底&#xff0c;随着OpenAI智能聊天机…

关于springboot跨域与拦截器的问题

今天写代码的时候遇到的一个问题&#xff0c;在添加自己设置的token拦截器之后&#xff0c;报错&#xff1a; “ERROR Network Error AxiosError: Network Error at XMLHttpRequest.handleError (webpack-internal:///./node_modules/axios/lib/adapters/xhr.js:112:14) at Axi…

基于微信小程序实现信阳毛尖茶叶商城系统设计与实现

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…

FPGA开发verilog语法基础1

文章目录 主体内容1.1 逻辑值1.2 数字进制格式1.3 数据类型1.3.1 寄存器类型1.3.2 线网类型1.3.3 参数类型1.3.4 存储器类型 参考资料 主体内容 1.1 逻辑值 1&#xff0c;逻辑0&#xff0c;表示低电平 2&#xff0c;逻辑1&#xff0c;表示高电平 3&#xff0c;逻辑X&#xff0…

Java阶段三02

第3章-第2节 一、知识点 面向接口编程、什么是spring、什么是IOC、IOC的使用、依赖注入 二、目标 了解什么是spring 理解IOC的思想和使用 了解IOC的bean的生命周期 理解什么是依赖注入 三、内容分析 重点 了解什么是spring 理解IOC的思想 掌握IOC的使用 难点 理解IO…

Android Preference浅析(设置Setting)

各位&#xff0c;好久不见&#xff0c;最近时间较为充裕&#xff0c;更新一下博客。 本篇在我的理解、认识范围内&#xff0c;讲述一下Android中的Preference&#xff08;破粉斯~&#xff09;这玩意&#xff0c;常用于项目中的设置模块中。在工作中我也主要负责了设置模块相关…

鸿道Intewell操作系统架构介绍之Intewell-Hyper I 虚拟化构型

鸿道Intewell-Hyper I 虚拟化构型是鸿道Intewell-V虚拟化架构下的构型体系&#xff01;鸿道Intewell-V是科东软件自主研发的实时虚拟化操作系统&#xff0c;包括鸿道Intewell-Hyper I 和鸿道Intewell-Hyper II。鸿道Intewell-V可以实现多个操作系统在同一物理硬件上并行运行&am…

讲一讲 kafka 的 ack 的三种机制?

大家好&#xff0c;我是锋哥。今天分享关于【K讲一讲 kafka 的 ack 的三种机制&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 讲一讲 kafka 的 ack 的三种机制&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Kafka的消息确认机制&…

多租户系统的应用架构

大家好&#xff0c;我是汤师爷~ 我们看下多租户系统的应用架构是如何从一层层构建起来的。 1、应用层设计 应用层的主要作用是为具体的用户场景提供应用服务&#xff0c;帮助用户在特定场景下完成操作。通过编排领域层的各项能力&#xff0c;实现SaaS产品的核心功能。应用层包…

波兰喜嘎嘎

之前做的一个项目&#xff0c;需要用c写一个服务去访问和控制硬件。这个服务是同事写的&#xff0c;今年年中离职了&#xff0c;很自然地&#xff0c;轮到我接手。 一、认知 我捣鼓了几天&#xff0c;勉强读懂一点原来的代码&#xff0c;并在原来基础上&#xff0c;做了一些修…

基于LORA的一主多从监测系统_4G模块上巴法云

临时添加一个更新&#xff0c;更换云平台为巴法云&#xff0c;事情的起因是因为阿里云这个老六&#xff0c;早上睡了一觉起来发短信告诉我云平台给我停了&#xff0c;得交钱&#xff0c;好嘛&#xff0c;不过也没办法现在这基本都收费&#xff0c;当然还有onenet可以用&#xf…