阻塞队列

阻塞队列

阻塞队列,字面意思就是带有阻塞功能,也就是这个线程不走了,不再参与cpu的调度,等到合适的时机条件成功时候再继续参与cpu的调度
主要体现在以下两方面
1.当队列满的时候,继续入队列,就会出现阻塞,阻塞到其他线程从队列中取走元素为止。
2.当队列空的时候,继续出队列,就会出现阻塞,阻塞到其他线程往队列中添加元素为止。
阻塞队列用处非常大,在后端开发中,有举足轻重的意义

生产者消费者模型

基于阻塞队列可以实现生产者消费者模型
先举个例子
三个人包饺子,在只有一个擀面杖的情况下
1.每个人,自己擀饺子皮,擀完了之后放下擀面杖再自己包饺子,这种做法,在擀和包之间来回切换,效率比较抵消,增加任务切换开销,假设只有一个擀面杖,三个人都想用,这个无疑又增加了锁竞争
2.一个人负责擀,另外两个负责包
擀的人就是生产者,包饺子的就是消费者,放饺子的那个喷子,就是交易场所

生产者消费者的优势
1.减少任务开销,减少锁竞争
2.解耦合耦合
降低模块之间的耦合,也就是降低模块之间的关联性
举个例子
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当然也有弊端
之前是A直接发给B,是一次通信
现在是A发给队列,然后队列发给B,是两次通信
而且消息在队列里不知道有没有阻塞的情况
因此效率降低了

3.削峰填谷

服务器收到的来自客户端/用户的请求,不是一成不变的,可能会因为一些突发事件,引起请求数目暴增
(比如之前鹿晗公布恋情的时候,微博就崩了,短时间内发生了大量的转发)
一台服务器,同一时刻能处理的请求数量是有上限的,不同的服务器承担的上限是不一样的。
机器的硬件资源有限(cpu,内存,硬盘,网络带宽),服务器每处理一次请求,都需要消耗一定的硬件资源,不同服务器配置不同,每个请求消耗的资源也不同。
一个分布式系统中,就经常会出现,有的机器承担压力更大,有的就更小
在这里插入图片描述
生产者消费者模型就可以很好的解决
在这里插入图片描述
虽然阻塞队列只是一个数据结构,但是正因为生产者消费者模型这么重要,于是大佬们就会把这个数据结构单独实现成一个服务器程序,并且使用单独的主机/主机集群来部署,此时这个所谓的阻塞队列,就进化成了“消息队列”
Java标准库已经提供了现成的阻塞队列来实现了,也就是BlockingQueue
在这里插入图片描述

public static void main(String[] args) throws InterruptedException {BlockingDeque<String> queue=new LinkedBlockingDeque<>();//如果括号放个数字,就代表当前阻塞队列最大的容量queue.put("hello");String tmp=queue.take();System.out.println(tmp);String tmp2=queue.take();//第二次take,由于阻塞队列里面没有元素了,因此在这里会发生阻塞情况,也就是程序没结束System.out.println(tmp2);}

在这里插入图片描述
下面根据阻塞队列,来实现一个生产者消费者模型
一个线程生产,一个线程消费

 public static void main(String[] args){// 搞一个阻塞队列, 作为交易场所BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();// 负责生产元素Thread t1 = new Thread(() ->{int count = 0;while (true){try{queue.put(count);System.out.println("生产元素: " + count);count++;Thread.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}}});// 负责消费元素Thread t2 = new Thread(() ->{while (true){try{Integer n = queue.take();System.out.println("消费元素: " + n);}catch (InterruptedException e){e.printStackTrace();}}});t1.start();t2.start();}

阻塞队列底层代码实现(自己实现一个阻塞队列)

class MyBlockingQueue
{//head,tail,size在下面的读操作中可能因为内存可见性问题读取不到正确的结果,因此加上volatile让编译器知道这三个数字是可变的volatile private int head=0;volatile private int tail=0;volatile private int size=0;String[] arr=new String[100];public void put(String elem) throws InterruptedException{synchronized (this){while(size>=arr.length){//队列满了,触发阻塞this.wait();}arr[tail]=elem;tail++;if(tail>=arr.length){tail=0;}size++;//用来唤醒队列为空的阻塞情况this.notify();}}public String take() throws InterruptedException {synchronized (this){if(size==0){//队列空了,也触发阻塞this.wait();}String elem=arr[head];head++;if(head>=arr.length){head=0;}size--;//用来唤醒队列满的阻塞情况this.notify();return elem;}}
}
public class Demo20
{public static void main(String[] args) throws InterruptedException {MyBlockingQueue queue=new MyBlockingQueue();Thread t1=new Thread(()->{int count=0;while(true){try {queue.put(count+"");System.out.println("生产元素:"+count);count++;Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});Thread t2=new Thread(()->{while(true){try {String x=queue.take();System.out.println("消费元素:"+x);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t1.start();;t2.start();}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

C++学习| MFC简单入门

前言&#xff1a;因为接手了CMFC的程序&#xff0c;所以需要对MFC编程方面有所了解。 C之MFC简单入门 MFC相关的概念MFCWIN32QT MFC项目基本操作MFC项目创建MFC项目文件解读界面和代码数据交互——加法器 MFC相关的概念 MFC MFC&#xff08;Microsoft Foundation Classes微软…

Springboot中创建拦截器

目录 目的 实现过程 1、创建拦截器 2、注册拦截器 完整代码 目的 在Springboot项目中创建拦截器&#xff0c;在进入Controller层之前拦截请求&#xff0c;可对拦截到的请求内容做响应处理&#xff0c;如&#xff1a;校验请求参数、验证证书等操作&#xff1b; 实现过程 1、创…

藏语翻译器:藏语翻译小助手

这是一款翻译功能齐全的翻译软件&#xff0c;主打藏语翻译功能&#xff0c;同时具备文字翻译、图片翻译、音频翻译、视频翻译、文档翻译等热门功能&#xff0c;支持将翻译结果导出为可编辑的文本文档&#xff0c;方便后续编辑整理。支持朗读原文和译文&#xff0c;帮助我们学习…

【树】 二叉树 堆与堆排序 平衡(AVL)树 红黑(RB)树

目录 1 树1.1 认识树1.2 树的相关概念1.3 树的表示孩子兄弟表示法 2 二叉树2.1 概念2. 2 特殊二叉树2.3 二叉树的性质2.4 二叉树的存储结构 3 堆 — 完全二叉树的顺序结构实现3.1 堆的概念3.2 核心代码3.3 堆应用1 堆排序2 TOP-K问题 4 二叉树的链式存储4.1 二叉链结构与初始化…

hhc.exe本地制作、手动生成chm电子书

准备几个文件 test.hhp&#xff08;配置文件&#xff09;test.hhc&#xff08;目录文件&#xff09;test.html&#xff08;点击节点右侧显示的内容&#xff09;hhc.exe去这里下载&#xff0c;链接在文章最后 test.hhp [OPTIONS] Compiled filetest.chm Contents filetest.hhc …

Springboot中使用过滤器校验PSOT类型请求参数内容

目录 目的 实现步骤 完整代码 目的 在Springboot中创建过滤器&#xff0c;用来过滤所有POST类型请求并获取body中的参数进行校验内容是否合法&#xff1b;该方法仅适用于POST类型请求&#xff0c;因为POST和GET请求的参数位置不一样所以处理方式也不一样&#xff0c;如果想要…

Kafka:安装和配置

producer&#xff1a;发布消息的对象&#xff0c;称为消息产生者 &#xff08;Kafka topic producer&#xff09; topic&#xff1a;Kafka将消息分门别类&#xff0c;每一个消息称为一个主题&#xff08;topic&#xff09; consumer&#xff1a;订阅消息并处理发布消息的对象…

vue 点击顶部tab重新请求列表

我们点击 1 2 来回切换时,发现客户经理的列表不会重新请求(菜单中含有客户经理) 这时我们添加以下代码就可以了 watch: {$route(route) {this.getList()}},/** 查询客户经理列表 */getList() {this.loading true;listManager(this.queryParams).then(response > {this.mana…

B2B2C多用户手机购物商城快速搭建(java开源)

要快速搭建一个B2B2C多用户手机购物商城&#xff0c;需要使用Java语言和开源框架进行开发。以下是一个基本的搭建步骤&#xff1a; 选择合适的开发框架 首先需要选择一个适合开发B2B2C多用户手机购物商城的Java开源框架&#xff0c;它提供了丰富的功能模块和灵活的扩展性&…

【论文阅读】对抗溯源图主机入侵检测系统的模仿攻击(NDSS-2023)

作者&#xff1a;伊利诺伊大学芝加哥分校-Akul Goyal、Gang Wang、Adam Bates&#xff1b;维克森林大学-Xueyuan Han、 引用&#xff1a;Goyal A, Han X, Wang G, et al. Sometimes, You Aren’t What You Do: Mimicry Attacks against Provenance Graph Host Intrusion Detect…

AD19 基础应用技巧(PCB设置快捷键)

众所周知&#xff0c;学会一个软件的快捷键操作可以大大提高我们的工作效率。 那么&#xff0c;Altium Designer软件如何设置快捷键&#xff1f; 以设置走线/放置过孔为例。 菜单栏 - 【放置】- 然后【Ctrl 鼠标左键 单击过孔】进入【Edit Command】界面。 在快捷方式一栏…

【JavaSE】接口的语法知识和使用方法总结

目录 1. 接口的概念 2. 语法规则 3. 接口特性 4. 接口使用 5. 实现多个接口 6. 接口间的继承 1. 接口的概念 在现实生活中&#xff0c;接口的例子比比皆是&#xff0c;比如&#xff1a;笔记本上的USB口&#xff0c;电源插座等。 电脑的USB口上&#xff0c;可以插&#x…

利用ChatGPT成功减肥20多斤!专业教练都表示它的建议实际上真有帮助

一份由ChatGPT创建的锻炼计划成功帮助一位男士爱上跑步&#xff0c;并减重26磅&#xff08;23.59斤&#xff09;。一位专业教练表示&#xff0c;这份由人工智能生成的减肥计划实际上确实很有帮助。 这位男士曾经非常厌恶跑步&#xff0c;但在使用ChatGPT三个月后表示&#xff0…

session-cookies 三个缓存 localStorage、sessionStorage、Cookies。

session-cookies session-cookies is localStorage、sessionStorage、Cookies。session-cookies This plugin is used to summarize the browser’s three caches localStorage, sessionStorage, Cookies.The plugin is designed to be quick and easy to use. Below is a sum…

jmeter 二次开发详解

目录 背景&#xff1a; 自定义 BeanShell 功能 自定义请求编写&#xff08;Java Sampler&#xff09; 实现 Java Sampler 功能的两种方式 案例&#xff1a;使用 JavaSampler 重写 HTTP 的 POST 请求 自定义函数助手 背景&#xff1a; JMeter 是一个功能强大的性能测试工具…

杂记 | 记录一次使用Docker安装gitlab-ce的过程(含配置交换内存)

文章目录 01 准备工作02 &#xff08;可选&#xff09;配置交换内存03 编辑docker-compose.yml04 启动并修改配置05 nginx反向代理06 &#xff08;可选&#xff09;修改配置文件07 访问并登录 01 准备工作 最近想自建一个gitlab服务来保存自己的项目&#xff0c;于是找到gitla…

PC端自动化工具pywinauto:如何选择应用程序的窗口?

如何选择需要打开的应用程序的窗口有2种方法&#xff1a; ①通过窗口标题/窗口类名来打开应用程序窗口&#xff0c;第一步就要打开窗口精灵&#xff0c;通过拖动放大镜到应用窗口找到窗口标题和窗口类名&#xff0c;如下图所示&#xff1a; 接下来就可以根据窗口类名和标题选择…

Unity 基础函数

Mathf&#xff1a; //1.π-PI print(Mathf.PI); //2.取绝对值-Abs print(Mathf.Abs(-10)); print(Mathf.Abs(-20)); print(Mathf.Abs(1)); //3.向上取整-Ce il To In t float f 1.3f; int i (int)f; …

TSINGSEE青犀视频汇聚平台EasyCVR视频广场面包屑侧边栏支持拖拽操作

TSINGSEE青犀视频汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、Web…

Mysql主从搭建 基于DOCKER

创建目录 #主节点目录 mkdir -p /home/data/master/mysql/#从节点目录 mkdir -p /home/data/slave/mysql/创建配置文件 # 主节点配置 touch /home/data/master/mysql/my.cnf# 从节点配置 touch /home/data/slave/mysql/my.cnf编辑配置文件 主节点配置文件 vim /home/data/m…