[多线程]阻塞队列和生产者消费者模型

目录

1.阻塞队列

  1.1引言

1.2Java标准库中的阻塞队列

1.3自主通过Java代码实现一个阻塞队列(泛型实现)

2.生产者消费者模型


1.阻塞队列

  1.1引言

 阻塞队列是多线程部分一个重要的概念,它相比于一般队列,有两个特点:
1.线程是安全的

2.带有阻塞功能

1) 队列为空,出队列就会阻塞,阻塞到其它线程入队列为止

2)队列未满,入队列就会出现阻塞,阻塞到其它线程出队列为止

1.2Java标准库中的阻塞队列

  • ArrayBlockingQueue 是一个固定大小的阻塞队列,底层采用数组实现。当队列已经满时,插入操作将被阻塞,直到队列中有元素被取出。当队列为空时,取出操作将被阻塞,直到队列中有新元素加入。因为队列的大小是固定的,所以可以在队列未满时进行批量插入操作。

  • LinkedBlockingQueue 是一个可以无限扩容的阻塞队列,底层采用链表实现。与ArrayBlockingQueue不同,当队列满时,插入操作将被阻塞,直到有其他线程移除了队列中的元素。与ArrayBlockingQueue不同,这个队列的大小是动态变化的。

  • PriorityBlockingQueue 是一个基于优先级的阻塞队列,底层采用堆数据结构实现。每次出队的元素都是优先级最高的元素。队列中的元素必须是可比较的对象,即实现了Comparable接口。与普通队列不同,PriorityBlockingQueue不保证插入元素的顺序,而是保证在出队时优先级高的元素先出队。

1.3自主通过Java代码实现一个阻塞队列(泛型实现)

public class BlockingQueue <T> {private Object[] array;private int Size = 0;private int head;private int tail;Object object = new Object();public BlockingQueue(int capacity){array = new Object[capacity];}
//添加元素 如果满了就进入阻塞里面去public void put( T t) throws InterruptedException {synchronized (object) {while (Size >= array.length) {object.wait();}array[tail] = t;tail++;Size++;if (tail >= array.length) {tail = 0;}object.notify();}}
//出队列,如果为0则添加到阻塞队列里去public T take() throws InterruptedException {T t = null;synchronized (object) {while (Size == 0) {object.wait();}t = (T) array[head];head++;if (head >= array.length) {head = 0;}Size--;object.notify();return t;}}}

2.生产者消费者模型

    生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。
生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等 待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取.
1) 阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力 .
比如在 " 秒杀 " 场景下 , 服务器同一时刻可能会收到大量的支付请求 . 如果直接处理这些支付请求 ,
服务器可能扛不住 ( 每个支付请求的处理都需要比较复杂的流程 ). 这个时候就可以把这些请求都放
到一个阻塞队列中 , 然后再由消费者线程慢慢的来处理每个支付请求 .
这样做可以有效进行 " 削峰 ", 防止服务器被突然到来的一波请求直接冲垮 .
2) 阻塞队列也能使生产者和消费者之间解耦
比如过年一家人一起包饺子 . 一般都是有明确分工 , 比如一个人负责擀饺子皮 , 其他人负责包 . 擀饺
子皮的人就是 " 生产者 ", 包饺子的人就是 " 消费者 ".
擀饺子皮的人不关心包饺子的人是谁 ( 能包就行 , 无论是手工包 , 借助工具 , 还是机器包 ), 包饺子的人
也不关心擀饺子皮的人是谁 ( 有饺子皮就行 , 无论是用擀面杖擀的 , 还是拿罐头瓶擀 , 还是直接从超
市买的 ).

2.1实际应用场景

在实际开发中,经常会用到分布式系统,服务器整个功能不是由一个服务器全部完成的,而是每个服务器负责一部分功能,通过服务器的网络通信,最终完成整个功能.

但是这样的话,入口服务器和用户服务器还有商品服务器之间的耦合就过大了,一旦后两个服务器出现问题,极有可能影响到入口服务器.

这样可以做到解耦合

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

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

相关文章

语义分割 DeepLab V1网络学习笔记 (附代码)

论文地址&#xff1a;https://arxiv.org/abs/1412.7062 代码地址&#xff1a;GitHub - TheLegendAli/DeepLab-Context 1.是什么&#xff1f; DeepLab V1是一种基于VGG模型的语义分割模型&#xff0c;它使用了空洞卷积和全连接条件随机&#xff08;CRF&#xff09;来提高分割…

JAVA-作业7-画一个笑脸

要求如题 代码如下&#xff1a; SmileFace01: import java.awt.Color; import java.awt.Graphics;import javax.swing.JPanel;public class SmileFace01 extends JPanel {Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);int width getWidth(…

MyBatis 设计模式解析

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

实用的 ES6 代码片段

在我们的开发流程中&#xff0c;我们经常会遇到一些具有挑战性的问题&#xff0c;而解决这些问题可能只需要几行代码。在本文中&#xff0c;我试图整理出一些有用的代码片段&#xff0c;帮助您在处理 URL、DOM、事件、日期、用户偏好等方面时更加便捷。 所有这些代码片段都是从…

代码随想录刷题题Day5

刷题的第五天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C / Python Day5 任务 ● 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数 ● 1. 两数之和 1 哈希表理…

【开题报告】基于SpringBoot的艾滋病科普平台的设计与实现

1.选题背景 艾滋病&#xff08;艾滋病毒感染与免疫缺陷综合征&#xff09;是一种严重的传染病&#xff0c;对人类的健康和社会稳定造成了极大的影响。全球范围内&#xff0c;艾滋病已经成为公共卫生领域的重大挑战之一。尽管在科学研究和医疗技术方面取得了一定进展&#xff0…

MT8390商显广告机主板_MTK联发科安卓主板方案开发

商显广告机采用MediaTek 联发科平台主板方案。安卓主板具有更高的性能、更丰富的接口、更多的存储空间以及更为便捷的网络连接方式&#xff0c;可以满足更为复杂的开发和应用需求使其应用领域更加多元化&#xff0c;被广泛应用于各行各业。 商显广告机主板基于联发科MT8390八核…

repmgr手动切换主从失败,报错‘DETAIL: local node last receive LSN‘

repmgr:5.4.0 pgsql: 14.2 OS:centos7.8刚搭建好的repmgr主从使用命令手动进行切换失败,日志如下 postgresdb02:~$ repmgr standby switchover NOTICE: executing switchover on node "db02" (ID: 2) NOTICE: local node "db02" (ID: 2) will be promoted…

智能AI系统ChatGPT网站系统源码+Midjourney绘画+支持DALL-E3文生图,支持最新GPT-4-Turbo模型

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么

一个页面从输入URL到加载显示完成经历了以下过程&#xff1a; DNS解析&#xff1a;浏览器会解析URL中的域名&#xff0c;将其转换为对应的IP地址。如果浏览器缓存中存在该域名的IP地址&#xff0c;则跳过DNS解析步骤。 建立TCP连接&#xff1a;通过解析得到的IP地址&#xff0…

Ubuntu18.04安装Ipopt-3.12.8流程

本文主要介绍在Ubuntu18.04中安装Ipopt库的流程&#xff0c;及过程报错的解决方法&#xff0c;已经有很多关于Ipopt安装的博客&#xff0c;但经过我的测试&#xff0c;很多都失效了&#xff0c;经过探索&#xff0c;找到可流畅的安装Ipopt的方法&#xff0c;总结成本篇博客。 …

使用typescript搭建express

使用typescript搭建express 开始 为这个项目创建一个新的目录&#xff0c;使用下面的命令初始化项目并创建一个包。 NPM init -y初始化后&#xff0c;让我们安装必要的包 npm i express dotenv cors helmet body-parser 在express中配置typescript npm i -D typescript typ…

C#多进程通信之共享内存方式

共享内存方式应该最简单易用的 直接上代码,下面列出了2种,一种是映射视图,一种是映射流,任选一种即可 服务端: MemoryMappedFile memoryAccessor MemoryMappedFile.CreateNew("ProcessCommunicationAccessor", 500, MemoryMappedFileAccess.ReadWrite);//创建共享…

WordPress批量上传文章和自动发布文章的方法

专业介绍&#xff1a;WordPress批量上传文章技术解析 在现代数字时代&#xff0c;内容创作是网络存在的驱动力之一。对于博客作者、新闻编辑和内容管理员而言&#xff0c;高效地批量上传文章至WordPress平台是提高工作效率的一个关键方面。WordPress作为最受欢迎的内容管理系统…

【C语言】递归详解

目录 1.前言2. 递归的定义3. 递归的限制条件4. 递归举例4.1 求n的阶乘4.1.1 分析和代码实现4.1.2 画图演示 4.2 顺序打印一个整数的每一位4.2.1 分析和代码实现4.2.2 画图推演 4.3 求第n个斐波那契数 5. 递归与迭代5.1 迭代求第n个斐波那契数 1.前言 这次博客内容是与递归有关&…

【数组】-Lc27-移除元素(快慢双指针)

写在前面 最近想复习一下数据结构与算法相关的内容&#xff0c;找一些题来做一做。如有更好思路&#xff0c;欢迎指正。 目录 写在前面一、场景描述二、具体步骤1.环境说明2.代码 写在后面 一、场景描述 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地移除所有数值等于…

迪文串口5使用查询方式发送数据

迪文屏串口5寄存器如下 发送数据我采用的不是中断&#xff0c;而是查询发送标志位实现的。 串口5不像串口2一样&#xff08;串口2可以位寻址&#xff0c;串口5不行&#xff09;&#xff0c;所以如果采用查询模式&#xff0c;需要判断寄存器的数据&#xff0c;我的写法比较简单…

Django高级之——Ajax、cookie与session

一 什么是Ajax AJAX&#xff08;Asynchronous Javascript And XML&#xff09;翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互&#xff0c;传输的数据为XML&#xff08;当然&#xff0c;传输的数据不只是XML,现在更多使用json数据&#xf…

apk和小程序渗透测试

apk和小程序渗透测试 文章目录 apk和小程序渗透测试小程序渗透测试apk和小程序的抓包安装证书apk渗透 小程序渗透测试 小程序的默认路径在 C:\Program Files (x86)\Tencent\WeChat\WeChatApp 使用UnpackMiniApp、wxappUnpacker工具完成逆向 先打开UnpackMiniApp.exe工具 选…

C++ 指针详解

目录 一、指针概述 指针的定义 指针的大小 指针的解引用 野指针 指针未初始化 指针越界访问 指针运算 二级指针 指针与数组 二、字符指针 三、指针数组 四、数组指针 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 指针与数组 一维数组 字符数组…