阻塞队列原理及Java实现

news2024/11/20 6:21:09

目录

1.阻塞队列

1.举例:包饺子

1.通过多线程来实现

2.通过阻塞队列来实现

2.消息队列

1.解耦

2.削峰填谷

用消息队列来解决

3.异步操作

3.实现一个阻塞队列

使用循环数组

4.实现生产者和消费者模型

完整代码

5.虚假唤醒

1.概念及原因

2.解决方法

 


1.阻塞队列

阻塞队列也是一种队列,也满足队列的特性,先进先出

  • 入队元素时,判断队列是否已满,若满了就阻塞等待,等有位置在插入
  • 出队元素时,判断队列是否为空,若为空就阻塞等待,等有元素再取出

1.举例:包饺子

  • 和面 -> 大前提,只需要做一次(单例模式)
  • 擀皮 
  • 包饺子

1.通过多线程来实现

2.通过阻塞队列来实现

2.消息队列

本质上就是一个阻塞队列,在此间基础上为放入阻塞队列的消息打一个标签,消息的标签可以实现分组的作用

1.解耦

在设计程序的时候提出过一些要求,比如:高内聚,低耦合

  • 高内聚:是一种组织代码的方式,把功能强相关的代码写在一起,方便后期维护,增加代码的复用性
  • 低耦合:不要把相同的代码写的到处都是,一般通过抽象的方式把代码封装成方法,直接调用即可

良好的代码组织方式,可以有效地降低成本

举例:购物支付过程中的订单,支付以及物流

 

解决方案 

2.削峰填谷

峰与谷指的是消息的密集程度

  • 在流量高峰的时候用消息队列缓冲
  • 在流量下降后,再将消息队列积攒的消息慢慢解决

比如在上述订单中,双十一这种日子订单量会暴增,此时我们增加多台服务器去维护显然并不符合常理,因为一年就只在这一天需要这么多服务器,准备太多会增加大量成本以及耗费资源

用消息队列来解决

3.异步操作

  • 同步:请求当必须死等对方的响应
  • 异步:发出请求之后,自己去干别的事情,有响应时会接收到通知从而处理响应

3.实现一个阻塞队列

  • 实现一个普通队列,底层用到了两种数据结构,一个是链表,一个是循环数组
  • 阻塞队列就是在普通的队列基础上加入了阻塞等待的操作

使用循环数组

public class MyBlockingQueueforList {

    private volatile Node head;

    private volatile int size = 0;

    public volatile int compacty = 3;

    public class Node{
        int val;
        Node next;
    }



    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        Node prev = head;
        while (prev != null) {
            sb.append(prev.val);
            if(prev.next != null) {
                sb.append("->");
            }
            prev = prev.next;
        }
        sb.append("]");
        return sb.toString();
    }

    public MyBlockingQueueforList(int compacty) {
        this.compacty = compacty;
    }

    public MyBlockingQueueforList() {};



    public void put(int val) throws InterruptedException {
        synchronized (this) {
            if (size == compacty); {
                this.wait();
            }
            Node prev = head;
            for (int i = 0; i < size; i++) {
                prev = prev.next;
            }
            prev.val = val;
            size++;
            this.notify();
        }
    }

    public int take() throws InterruptedException {
        synchronized (this) {
            while (size == 0) {
                this.wait();
            }
            int val = head.val;
            head = head.next;
            size--;
            this.notify();
            return val;
        }
    }
}

4.实现生产者和消费者模型

完整代码

import java.util.concurrent.TimeUnit;

public class practice01 {

    private  static MyBlockingQueue queue = new MyBlockingQueue(3);
    public static void main(String[] args) throws InterruptedException {


        Thread t1 = new Thread(() -> {
            int num = 1;
            while (true) {
                System.out.println("生产了消息"+num);
                try {
                    queue.put(num);
                    num++;
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });

        Thread t2 = new Thread(() -> {
            while (true) {
                try {
                    int num = queue.take();
                    System.out.println("减少了消息"+num);
                    TimeUnit.SECONDS.sleep(10);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });

        t1.start();
        t2.start();


    }
}

5.虚假唤醒

1.概念及原因

2.解决方法

 

最后别忘了给共享变量加volatile 

 

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

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

相关文章

关于GD32替换STM32(pin to pin)搭载rt-thread操作系统,需要注意的问题总结

1、SystemInit()函数 该函数位于启动文件中的Reset_Handler中(具体实现在GD32位于system_gd32f4xx.c&#xff0c;STM32位于system_stm32f4xx.c中&#xff0c;几乎所有的文件&#xff0c;你只要把gd换成st就能找到对应的文件)&#xff0c;gd的叫startup_gd32Fxxx.s&#xff0c;…

4.HIVE函数

1.hive函数 1.1 空值替换 两个输入&#xff1a;nvl(col,default_num) : 如果colum不为null&#xff0c;返回col.否则返回default_num 多个输入&#xff1a;coalesce(col1, col2, col3, ....) &#xff1a;从左到右找第一个不为null的值 例如&#xff1a;求所有员工的平均薪…

【操作系统】总结

依旧是小林coding 的内容 存储架构 现代 CPU 都是多核心的&#xff0c;线程可能在不同 CPU 核心来回切换执行&#xff0c;这对 CPU Cache 不是有利的&#xff0c;虽然 L3 Cache 是多核心之间共享的&#xff0c;但是 L1 和 L2 Cache 都是每个核心独有的&#xff0c;如果一个线…

VMWare安装windows7虚拟机提示Operating System not found

前提&#xff1a;下载windows7 Gost并创建虚拟机&#xff0c;启动报错&#xff1a;Operating System not found 解决办法 用微PE工具制作iso系统&#xff0c;对虚拟机进行分区 下载地址&#xff1a;https://www.wepe.com.cn/ 制作方法&#xff0c;双击安装程序&#xff0c;选…

最困难的也是最简单的,做好这两点不盈利天理难容

投资者应该时刻记住&#xff0c;在外汇交易中复杂的方法并不总是最好的。Forexclub发现交易中最困难的是正确识别进场点和出场点。 从技术上来说&#xff0c;进入交易是非常容易的&#xff0c;你只需要点击一个按钮&#xff0c;你就在那里交易。但是你会从中获利吗?没人能回答…

【Linux Network】网络编程套接字(代码练习)—UDP

目录 1. 常用接口 2. C/S 回声模拟 3. C/S myshell 的制作 Linux网络编程✨ 1. 常用接口 socket&#xff1a;创建套接字&#xff1a; // 创建 socket 文件描述符 int socket(int domain, int type, int protocol); 返回值&#xff1a; 套接字创建成功返回一个文件描述符 &…

GAMMA电源维修直流高压电源模块RR300-1P

美国GAMMA高压电源维修参数&#xff08;RR分离式&#xff09;&#xff1a; 输入&#xff1a;220VAC 或 380VAC&#xff08;视型号而定&#xff09; 输出电压&#xff1a;550KV&#xff0c;功率&#xff1a;0-10KW或定制 纹波率0.01 &#xff1b;稳定度0.01/1H 控制部分19英…

(只需两步)让ChatGPT帮你制作出漂亮的PPT

目录 第一步&#xff1a;生成 PPT 代码 第二步&#xff1a;将代码转化为 PPT 还在为制作PPT而烦恼吗&#xff1f; 让ChatGPT来帮您&#xff01; 本篇文章介绍如何利用ChatGPT一键生成PPT文字和样式&#xff0c;省时省力又专业&#xff01; &#xff08;真的只需两步&#xf…

案例实践|云智慧ITSM产品在利星行汽车的运维实践

ITSM&#xff08;信息技术服务管理&#xff09;是一种以客户为中心的方法&#xff0c;旨在提高信息技术的效率和效果。在传统零售行业&#xff0c;ITSM可以帮助连锁零售企业提升客户服务水平&#xff0c;通过IT服务台提供快速响应和解决客户的问题和需求。同时&#xff0c; ITS…

PSP - 配置 AlphaFold2 的高效运行环境

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130560538 AlphaFold2 是由 DeepMind 开发,可以根据蛋白质的氨基酸序列预测其三维结构,准确度经常可以与实验相媲美。DeepMind 和 EMBL 的欧洲生物信息学研…

最新的Ubuntu20安装配置Nagios教程

首先声明&#xff0c;盗帖可耻&#xff0c;我发现有人把我文章复制到百度文库&#xff0c;并设置vip下载&#xff0c;直接照搬别人的还牟利&#xff0c;恶心&#xff01;&#xff01;&#xff01; 目录 一、简介 二、安装配置 1、安装Nagios以及相关插件 a、安装Nagios核心…

Blender渲染动画太慢怎么办?用云渲染啊!

1995 年&#xff0c;荷兰开发者 Ton Roosendaal 开发了三维制作软件 Blender &#xff0c;这是一款功能强大的 3D 创建工具&#xff0c;用于创建 3D 图形、交互式 3D 应用程序、视频游戏、虚拟现实视频和动画。它自 2002 年以来一直作为开源软件提供&#xff0c;可在 macOS、Li…

嵌入式基础测试手册——基于NXP iMX6ULL开发板(3)

前 言 本文档适用开发环境: Windows开发环境:Windows 7 64bit、Windows 10 64bit 虚拟机:VMware15.1.0 Linux开发环境:Ubuntu18.04.4 64bit U-Boot:U-Boot-2020.04 Kernel:Linux-5.4.70 Linux SDK:5.4.70_2.3.0 基于测试板卡:创龙科技TLIMX6U-EVM是一款基于NXP…

Gradio的web界面演示与交互机器学习模型,主要特征《2》

上一篇文章是介绍了安装与使用&#xff0c;Gradio的web界面演示与交互机器学习模型&#xff0c;安装和使用《1》 了解到这个gradio&#xff0c;真是个贴心的产品&#xff0c;接下来更多的关注一些重要的细节特征&#xff0c;让我们去更完善和熟练的使用它。 1、简单计算器的示…

Netty基础(三)

1.Netty模型 1.1.工作原理示意图1-简单版 Netty主要基于主从Reactors多线程模型(如图)做了一定的改进,其中主从Reactor多线程模型有多个Reactor; 说明: ①.BossGroup线程池中的线程维护了Selector,只关注Accecpt事件; ②.当接收到Accept事件,获取到连接对应的SocketChannel…

数据结构入门--栈和队列

栈 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除的一段为栈顶&#xff0c;另一端为栈底。栈中元素遵循后进先出LIFO&#xff08;Last In First Out&#xff09;原则。 压栈&#xff1a;栈的插…

玄子Share - 2023.1 IDEA 部署Web项目

玄子Share - 2023.1 IDEA 部署Web项目 创建项目 IDEA 2023 创建Jakarta EE项目 模板&#xff1a;选择使用 Web 应用程序 应用程序服务器&#xff1a;选择安装的 Tomcat 第一次创建项目可能识别不到 Tomcat 需要手动添加 Tomcat 服务器 设置 Tomcat 主目录为 Tomcat 的安装路径…

给httprunnermanager接口自动化测试平台加点功能(二)

文章目录 一、背景1.1、新增字段1.2、简化流程1.3、举一反三 二、总结 一、背景 继续前面的功能改造&#xff0c;这回又是什么需求呢&#xff1f;在编写测试用例的时候&#xff0c;咱们有看到列表有作者名称&#xff0c;也就是说&#xff0c;可以在用例列表就可以知道这条用例是…

网络数据包丢失监控

什么是网络数据包 数据包或网络数据包是通过网络传输的小数据单元。顾名思义&#xff0c;这些是小的、离散的数据单元。单独来看&#xff0c;这些单位不一定有多大意义。它们只是正在传输的整体消息的一部分&#xff0c;这些消息已被组装成多个层。但是&#xff0c;当组合在一…

人工智能前景

人工智能AI的未来非常广阔和光明。随着科技的不断发展和普及&#xff0c;人工智能已经开始逐渐融入我们生活的方方面面&#xff0c;比如智能家居、智能医疗、无人驾驶等等。未来&#xff0c;随着更多的应用场景被开拓和挖掘&#xff0c;人工智能的应用范围将会越来越广泛&#…