阻塞队列和生产消费模型

阻塞队列

阻塞队列的概念

队列相信我们已经不陌生了 之前也学过很多队列 比如: 普通队列优先级队列 两种
这两种队列都是线程不安全的
而我们讲的阻塞队列 刚好可以解决线程安全问题 也是先进先出 并且带有阻塞功能.
阻塞功能是怎么回事呢

就是如果入队的时候阻塞队列为满 ,则当前线程就会进入阻塞状态,阻塞到有出队列操作才会再唤醒线程继续执行 ,相同 如果出队时阻塞队列为空,则当前线程也会进入阻塞状态 直到有新元素入队操作才会唤醒继续执行该线程.

在Java标准库中,BlockingQueue这个就是标准库提供的阻塞队列. 阻塞队列在实际开发中使用的场景十分广泛. 在阻塞方法中 有独特的进队列和出队列的方法 其他一些普通的方法阻塞队列也有 ,但是使用阻塞队列一般都不会再使用普通队列的方法了.

消息队列

消息队列这种数据结构其实也是阻塞队列的一种 ,也带有阻塞特性.它不是普通的先进先出,而是通过topic这样的参数来对数据进行分类,出队列的时候,指定topic,每个topic下的数据是先进先出. 消息队列只要应用于生产者消费者模型.

生产者消费者模型

什么是生产者和消费者模型呢 ?
举个例子:
就相当于两个人制作饺子 要分为两步 一步是擀饺子皮 一步是包饺子. 要两个人分工合作,实际上 要包饺子就得先擀饺子皮 那擀饺子皮的人相当于生产者 包饺子皮的人就相当于消费者 擀好的饺子皮要用一个容器来盛放 ,而这个容器就相当于阻塞队列/消息队列. 有了这个容器就会有阻塞功能 ,现在A擀饺子皮 B包饺子 如果B包饺子包得快 A擀饺子皮慢 那容器里面的饺子皮很快就会空了 这时候B就要阻塞等待A擀饺子皮 每擀一个就包一个饺子 ,相反 如果A擀饺子皮擀得比较快 B包饺子慢,那么容器很快就会满了,这样A就会阻塞等待 B包饺子 B每包一个 A就擀一个.

在这里插入图片描述
上面图片就是生产者和消费者模型

你们想一想 在实际开发中为什么要用到这个生产者消费者模型 ? 相当于在开发中 有两种服务器 :请求服务器Q和应用服务器Y 如果QY直接传递消息 ,没有阻塞队列的情况下,如果Q突然请求有很多的时候,Y的请求也就会跟着暴涨 ,但Y服务器是应用服务器,他处理任务的过程很复杂 是重量级的 这样就会让Y服务器直接G.

这时我们如果我们引入生产者消费者模型,这样即使Q服务器的请求再怎么多,也不会影响到Y服务器 最坏的情况也就是Q服务器挂了 但Y服务器不会有任何影响 因为Q的请求都会放在阻塞队列中 , 有界 的阻塞队列就会引起阻塞 Y服务器 还是和原来一样处理这些请求 这样就起到了"削峰填谷"的作用.
这个模型还有一个优势就是高内聚低耦合 两个服务器不会直接接触 一个挂了不会对另一个产生影响.

用循环队列实现一个简单的阻塞队列 用于实现一个生产者消费者模型

第一种 就是生产者生产快 而消费者慢 就会出现 程序一运行生产者咔咔就会生产满了 接下来就会阻塞 消防者每消费一个 生产者才会生产一个. 下面我们通过代码来实现一下:

class MyBlockingQueue{private String[] elems = null;private volatile int head = 0;private volatile int tail = 0;private volatile int size = 0;public MyBlockingQueue(int capacity) {elems = new String[capacity];}void put(String elem) throws InterruptedException {//先加锁synchronized (this) {while (size >= elems.length) {//队列满了 ,就要等待this.wait();}//把新的元素放到tail所在的位置上elems[tail] = elem;tail++;if (tail >= elems.length) {//到达末尾  ,就回到开头tail = 0;}//更新size的值size++;//唤醒下面take的waitthis.notify();}}String take() throws InterruptedException {synchronized (this) {while (size == 0) {//为空要等待this.wait();}//取出 head指向的元素String result = elems[head];head++;if (head >= elems.length) {head = 0;}size--;//唤醒put上面的waitthis.notify();return result;}}
}public class Text2 {//实现一个阻塞队列 模拟一个生产者消费者模型public static void main(String[] args) {//实例化一个阻塞队列的对象   利用该阻塞队列实现一个生产者消费者模型MyBlockingQueue queue = new MyBlockingQueue(1000);//生产者线程Thread t1 = new Thread(() -> {try {int count = 0;while (true) {queue.put(count + "");System.out.println("生产:" + count);count++;}}catch (InterruptedException e) {e.printStackTrace();}});//消费者线程Thread t2 = new Thread(() ->{try {while (true) {String result = queue.take();System.out.println("消费:" + result );Thread.sleep(1000);}}catch (InterruptedException e) {e.printStackTrace();}});t1.start();t2.start();}
}

运行截图:
在这里插入图片描述
其实这里生产者和消费者的频率和快慢 我们都是可以通过代码来控制的 .
上面就是阻塞队列的应用场景 .

相信通过上诉内容 大家都了解并掌握阻塞队列了吧!

下一章内容 : 我们就会讲到线程池的有关内容 .

谢谢大家的浏览 !!!

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

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

相关文章

rabbitmq安装rabbitmq-delayed-message-exchange插件

下载地址:Community Plugins | RabbitMQ 上传到rabbitmq安装目录的/plugins目录下 我的是/usr/lcoal/rabbitmq/plugins/ 直接安装 [rootk8s-node1 rabbitmq]# rabbitmq-plugins enable rabbitmq_delayed_message_exchange [rootk8s-node1 rabbitmq]# rabbitmq-pl…

pringboot2集成swagger2出现guava的FluentIterable方法不存在

错误信息 Description: An attempt was made to call a method that does not exist. The attempt was made from the following location: springfox.documentation.spring.web.scanners.ApiListingScanner.scan(ApiListingScanner.java:117) The following method did not ex…

c语言例题,求数组中最大值,99乘法口诀表

例题1:求出数组中最大的值 根据题意,我们知道的是需要从一个数组中找到一个最大的元素并且输出。那首先我们先建立一个数组,然后将一些不有序的整型元素放到数组中,然后再建立一个变量来存放数组中的第一个元素,通过一…

算法设计与分析实验报告c++实现(八皇后问题、连续邮资问题、卫兵布置问题、圆排列问题)

一、实验目的 1.加深学生对回溯法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握; 2.提高学生利用课堂所学知识解决实际问题的能力; 3.提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 用回溯…

vue简单使用五(组件的使用)

目录 如何定义组件: 组件的命名: 父组件向子组件传值: 子组件向父组件传值: 如何定义组件: 全局组件定义: 局部组件定义: 组件的基本使用: 打印结果: 组件的命名&#xf…

分类预测 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络数据分类预测

分类预测 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络数据分类预测 目录 分类预测 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现OOA-BP鱼鹰算法优化BP神经网络多特征分类预测(完整源码和数…

MATLAB Simulink仿真搭建及代码生成技术—01自定义新建模型模板

MATLAB Simulink仿真搭建及代码生成技术 目录 01-自定义新建模型模板点击运行:显示效果:查看模型设置: 01-自定义新建模型模板 新建模型代码如下: function new_model(modelname) %建立一个名为SmartAss的新的模型并打开 open_…

【微服务】------常见模型的分析与比较

DDD 分层架构 整洁架构 整洁架构又名“洋葱架构”。为什么叫它洋葱架构?看看下面这张图你就明白了。整洁架构的层就像洋葱片一样,它体现了分层的设计思想。 整洁架构最主要的原则是依赖原则,它定义了各层的依赖关系,越往里依赖越…

[大模型]Langchain-Chatchat安装和使用

项目地址: https://github.com/chatchat-space/Langchain-Chatchat 快速上手 1. 环境配置 首先,确保你的机器安装了 Python 3.8 - 3.11 (我们强烈推荐使用 Python3.11)。 $ python --version Python 3.11.7接着,创建一个虚拟环境&#xff…

Web前端-Ajax

Ajax 概念:Asynchronous JavaScript And XML,异步的JavaScript和XML。 作用: 1.数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。 2.异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术,如:搜索联想、用户名是否可用的校验等等…

Ubuntu 22上安装Anaconda3。下载、安装、验证详细教程

在Ubuntu 22上安装Anaconda3,你可以遵循以下步骤: 更新系统存储库: 打开终端并运行以下命令来更新系统存储库: sudo apt update安装curl包: 下载Anaconda安装脚本通常需要使用curl工具。如果系统中没有安装curl&#x…

基于springboot的医院挂号取药缴费管理系统

一、基于springboot的医院挂号取药缴费管理系统 简介系统和功能 二、技术框架 这是一款基于SpringbootLAYUIMysql的管理系统 开发语言:Java JDK1.8 数据库:mysql5.7 前端:LAYUI框架 后端:Springboot框架、Spring框架、持久层My…

WinForms零基础进阶控件教程(超实用详细版)

文章目录 树型控件TreeView常用属性常用事件添加、删除树节点通过代码添加树节点通过代码删除树节点:管理节点图标响应事件,获取选中节点 列表视图ListView常用属性常用事件添加、删除项使用ListViewItem集合编辑器添加,删除项:通…

LED显示IC-点阵数码管显示驱动/抗干扰数码管驱动VK1650 SOP16/DIP16

产品品牌:永嘉微电/VINKA 产品型号:VK1650 封装形式:SOP16/DIP16 概述 VK1650是一种带键盘扫描电路接口的 LED 驱动控制专用芯片,内部集成有数据锁存器、LED 驱动、键盘扫描等电路。SEG脚接LED阳极,GRID脚接LED阴极&…

WebGL 2.0相较于1.0有什么不同?

作者:STANCH 1.概述 WebGL 1.0自推出以来,已成为广泛支持的Web标准,既能跨平台,还免版税。它通过插件为Web浏览器带来高质量的3D图形,这是迄今为止市场上使用最广泛的Web图形,并得到Apple,Goog…

ControllerAdvice用法

ControllerAdvice用法 ControllerAdvice是一个组件注解,它允许你在一个地方处理整个应用程序控制器的异常、绑定数据和预处理请求。这意味着你不需要在每个控制器中重复相同的异常处理代码,从而使得代码更加简洁、易于管理。 主要特性 全局异常处理&a…

【vue】v-model.lazy等(非实时渲染)

v-model&#xff1a;实时渲染v-model.lazy&#xff1a;失去焦点/按回车后&#xff0c;才渲染v-model.number&#xff1a;值转换为数字v-model.trim&#xff1a;去除首尾空格 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&qu…

MDK平台 - Code, RO-data , RW-data, ZI-data详解

文章目录 1 . 前言2 . Code, RO-data , RW-data, ZI-data解析3 . RAM上电复位4 . 细节扩展5 . 总结 【全文大纲】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 前言 MDK编译后&#xff0c;会列出Code, RO-data , RW-data, ZI-data&#xff0c;以下解析…

股票价格预测 | Python使用LSTM预测股票价格

文章目录 效果一览文章概述代码设计效果一览 文章概述 Python使用LSTM预测股票价格 代码设计 import pandas as pd import matplotlib.pyplot as plt import numpy as np import tensorflowfrom numpy import

2024年蓝牙耳机哪个品牌最好?五大热门机型PK,新手必看!

​随着生活节奏的加快&#xff0c;蓝牙耳机已经成为了我们日常生活中不可或缺的伙伴。它不仅让我们的听音乐、观看视频和通话变得更加便捷&#xff0c;还带来了无线的自由体验。面对市场上众多的选择&#xff0c;我为你精挑细选了几款表现优异的蓝牙耳机&#xff0c;希望能帮助…