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

目录

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实际应用场景

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

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

这样可以做到解耦合

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

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

相关文章

鸿蒙HarmonyOS从零实现类微信app效果——基础界面搭建

最近鸿蒙HarmonyOS开发相关的消息非常的火&#xff0c;传言华为系手机后续将不再支持原生Android应用&#xff0c;所以对于原Android应用开发对应的Harmony版本也被一系列大厂提上了日程。作为一个名义上的移动端开发工程师&#xff08;(⊙o⊙)…&#xff0c;最近写python多过A…

应急响应-挖矿病毒处理

应急响应-挖矿病毒处理 使用top​命令实时监控占用CPU资源的是哪个进程&#xff0c;结果可以看到是2725这个进程。 ​​ 再使用netstat -anltp命令查看网络连接状态&#xff0c;定位到对应的PID号后&#xff0c;就拿到了远程地址 ​​ 拿到远程IP&#xff0c;结果是VPN入口…

JVM 运行时内存(三)

Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、From Survivor 区和 To Survivor 区)和老年代。 1. 新生代 是用来存放新生的对象。一般占据堆的 1/3 空间。由于频繁创建对象&#xff0c;所以新生代会频繁触发MinorGC 进行垃圾回收。新生代又分为 Eden 区、ServivorFrom、…

人工智能_机器学习059_非线性核函数_poly核函数_rbf核函数_以及linear核函数效果对比---人工智能工作笔记0099

人工智能_机器学习059_非线性核函数介绍---人工智能工作笔记0099 那么我们应该如何调整这个SVC的参数,也就是我们应该使用哪种核函数,比较合适呢?这取决于我们的数据,适合使用哪个核函数,正好我们有 提供的score = accuracy_score(y_test,y_pred) 这样的评分函数,我们可以根据…

B2B公司如何寻找意向客户的联系方式?

在B2B公司的营销过程中&#xff0c;少不了寻找意向客户的阶段&#xff0c;这也是销售过程中非常重要的一步。 很多新人都是拿到客户联系方式&#xff0c;就直接打电话拜访&#xff0c;俗话说不打没有准备的仗&#xff0c;因此在拜访客户之前就应该做好功课&#xff0c;充分了解…

AI医疗交流平台【Docola】申请823万美元纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于美国的AI医疗交流平台Docola近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为 (DOCO) &#xff0c;Docola计划…

【五分钟】熟练使用numpy的histogram函数(干货!!!)

histogram函数重要参数详解 def histogram(a, bins10, rangeNone, normedNone, weightsNone, densityNone):...位置参数a&#xff1a; The histogram is computed over the flattened array.&#xff08;源码对参数a的解释&#xff09; 从源码对参数a的解释来看&#xff0c;参…

从0开始使用Maven

文章目录 一.Maven的介绍即相关概念1.为什么使用Maven/Maven的作用2.Maven的坐标 二.Maven的安装三.IDEA编译器配置Maven环境1.在IDEA的单个工程中配置Maven环境2.方式2&#xff1a;配置Maven全局参数 四.IDEA编译器创建Maven项目五.IDEA中的Maven项目结构六.IDEA编译器导入Mav…

设计模式之代理模式(1)

目录 概述定义应用场景主要角色类图 详述基本代码应用实例符合的设计原则 总结 概述 定义 代理模式是一种结构型设计模式&#xff0c;它允许通过一个代理对象来控制对原始对象的访问。代理对象可以在不改变原始对象的情况下&#xff0c;增加一些额外的功能&#xff0c;例如权限…

差分基准站

差分基准站&#xff0c;又称参考接收机&#xff0c;是一种固定式卫星接收机&#xff0c;用于提高卫星定位精度。 差分基准站的作用是提供已知位置和准确的位置信号&#xff0c;以纠正其他移动定位终端接收器接收到的卫星信号中的误差。 卫星定位信号会受到多种因素的影响&#…

selenium自动化测试:xpath八种定位方式!

01、前言 如果可以的话&#xff0c;请先关注&#xff08;专栏和账号&#xff09;&#xff0c;然后点赞和收藏&#xff0c;最后学习和进步。你的支持是我继续写下去的最大动力&#xff0c;个人定当倾囊而送&#xff0c;不负众望。谢谢&#xff01;&#xff01;&#xff01; 1.…

【蓝桥杯省赛真题49】Scratch小狗避障 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解

目录 scratch小狗避障 一、题目要求 编程实现 二、案例分析 1、角色分析

JDK安装太麻烦?一篇文章搞定

JDK是 Java 语言的软件开发工具包&#xff0c;主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心&#xff0c;它包含了JAVA的运行环境&#xff08;JVMJava系统类库&#xff09;和JAVA工具。 JDK包含的基本组件包括&#xff1a; javac – 编译器&#xf…

从零开始入门Zapier:与ChatGPT双剑合璧,手把手教程让你进入AI与自动化新纪元

coments 1. 1. 打开Zapier的官方界面 登录之后&#xff0c;会出现一个调查表&#xff0c;可以根据自己的情况进行选择。 第一次注册成功&#xff0c;会送你14天的免费体验

SAP ABAP ALV创建动态树形菜单

创建动态树形菜单——ALV 创建的合同越多&#xff0c;使用树形菜单能比较直观的地显示&#xff0c;而且展开下阶也能明确的知识相关的信息&#xff0c;比如合同中的出口成品有哪些。 设计要点&#xff1a; 第一、 Node_key一定要区分&#xff0c;不能重复&#xff0c;否则出错…

C语言--每日选择题--Day35

第一题 1. 有如下定义&#xff1a;(x y) % 2 (int) a / (int) b 的值是&#xff08;&#xff09; int x 3; int y 2;float a 2.5; float b 3.5; A&#xff1a;0 B&#xff1a;2 C&#xff1a;1.5 D&#xff1a;1 答案及解析 D 本题是考查强制类型转换和操作符优先级 操作…

JavaWeb 前端工程化

前端工程化是使用软件工程的方法来单独解决前端的开发流程中模块化、组件化、规范化、自动化的问题,其主要目的为了提高效率和降低成本。 前端工程化实现技术栈 前端工程化实现的技术栈有很多,我们采用ES6nodejsnpmViteVUE3routerpiniaaxiosElement-plus组合来实现 ECMAScri…

由11月27日滴滴崩溃到近两个月国内互联网产品接二连三崩溃引发的感想

文章目录 知乎文分析微信聊天截图微信公众号 滴滴技术 发文k8s 官方文档滴滴官方微博账号 近两个月国内互联网产品“崩溃”事件2023-10-23 语雀崩溃2023-11-12 阿里云崩溃2023-11-27 滴滴崩溃2023-12-03 腾讯视频崩溃总结 我的感想 知乎文分析 最近连续加班&#xff0c;打车较…

简单的界面与数据分离的架构

草图绘制于2021年2月19日 当时用到了&#xff1a;qt的子项目、delegate、view和widget的关系&#xff0c;有感而写的小备忘&#xff0c;2022年底考的软件设计师里面的设计模式虽然可能早已包含&#xff0c;但自己也得有自己啊&#xff0c;要把自己哪怕不成熟的东西也记录下来&…

操作系统概述及发展史、Linux内核、发行版及应用领域

一、 操作系统&#xff08;Operation System&#xff0c;OS&#xff09; 裸机&#xff1a;没有安装操作系统的计算机 如果想在 裸机 上运行自己所编写的程序&#xff0c;就必须用机器语言书写程序如果计算机上安装了操作系统&#xff0c;就可以在操作系统上安装支持的高级语言…