阻塞队列(模拟+生产者消费者)

阻塞队列

字面意思,带有阻塞功能的队列,满足队列先进先出的性质

作用:

1.如果队列为空,此时执行出队列操作,就会阻塞,直到往此队列里添加元素为止(队列不为空)

2.如果队列为满,此时执行入队列操作,也会阻塞,直到往此队列删元素(队列不为满)。

标准库提供的阻塞队列

 //标准库提供的阻塞队列
 BlockingQueue<Integer> queue = new LinkedBlockingDeque<>();

 //带有优先级的阻塞队列 底层实现----堆
 PriorityBlockingQueue<Integer> queue1 = new PriorityBlockingQueue<>();

 //基于链表实现的阻塞队列
 LinkedBlockingDeque<Integer> queue2 = new LinkedBlockingDeque<>();

 //基于数组实现的阻塞队列
 ArrayBlockingQueue<Integer> queue3 = new ArrayBlockingQueue<>(10); //需要给出数组容量大小

队列空阻塞

        //标准库提供的阻塞队列
        BlockingQueue<Integer> queue = new LinkedBlockingDeque<>();

        //普通队列方法 offer poll peek
        //阻塞队列方法 put take --->带有阻塞功能

        queue.put(3);
        queue.take();

        //此时队列已为空
        System.out.println("此时队列为空");
        queue.take();


队列满阻塞

        //标准库提供的阻塞队列
        BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(3);

        //普通队列方法 offer poll peek
        //阻塞队列方法 put take --->带有阻塞功能

        queue.put(3);
        queue.put(3);
        queue.put(3);

        //此时队列已为满
        System.out.println("此时队列为满");
        
        //阻塞
        queue.put(3);

 模拟实现阻塞队列(数组实现)

public class myBlockingQueue {
    //模拟实现阻塞队列 --- 基于数组实现

    private int[] elem;
    private int size;
    private int head;
    private int tail;
    private Deque<Integer> queue = null;

    public myBlockingQueue(int length){
        queue = new LinkedList<>();
        elem = new int[length];
    }

    //入队列
    public void put(int value) throws InterruptedException {
        //wait/notify 必须和synchronized成对使用
        synchronized (this){
            //判断是否为满
            if(elem.length == size){
                //阻塞
                this.wait();
            }
            elem[tail++] = value;
            if(tail >= elem.length){
                tail = 0;
            }
            size++;
            //这个notify是唤醒take操作的wait
            this.notify();
        }

    }

    //出队列
    public void take() throws InterruptedException {
        synchronized (this){
            if(size == 0){
                //阻塞
                this.wait();
            }
            int result = elem[head++];
            if(head >= elem.length){
                head = 0;
            }
            //这个notify是唤醒put操作的wait
            size--;
            this.notify();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        myBlockingQueue m = new myBlockingQueue(3);
        m.put(1);
        m.take();
        System.out.println("队列阻塞");
        m.take();
    }
}

需要注意的点:

1.wait/notify操作必须和synchroinzed成对出现,否则会报异常

2.搞清楚wait和notify的位置,wait操作出现在当队列为空还取出队或者队列为满还入元素的时候,take操作的notify操作唤醒的是put操作的wait,put操作的notify唤醒的是take操作的wait操作


生产者消费者模型

 public static void main(String[] args) {
        BlockingQueue<Integer> blockingQueue = new LinkedBlockingDeque<>();
        Thread producer = new Thread(() -> {
            for(int i = 0; i < 10; i++){
                try {
                    //让控制台打印慢点,结果更明了
                    Thread.sleep(1000);
                    System.out.print("生产:"+i+"  ");
                    blockingQueue.put(i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread customer = new Thread(() -> {
            for(int i = 0; i < 10; i++){
                try {
                    Thread.sleep(1000);
                    System.out.print("消费:"+i+"  ");
                    blockingQueue.take();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        producer.start();
        customer.start();
    }

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

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

相关文章

GIS地理信息平台+智慧巡检技术解决方案(Word原件)

1.系统概述 1.1.需求描述 1.2.需求分析 1.3.重难点分析 1.4.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 3.系统功能设计 3.1.功能清单列表软件全套精华资料包清单部分文件列表&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项…

故障诊断 | 基于迁移学习和SqueezeNet 的滚动轴承故障诊断(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 将一维轴承振动信号转换为二维尺度图&#xff08;时频谱图&#xff09;&#xff0c;并使用预训练网络应用迁移学习对轴承故障进行分类。 迁移学习显著减少了传统轴承诊断方法特征提取和特征选择所花费的时间&#xff…

果园系统养殖游戏喂养偷菜种植浇水养成小程序功能介绍

以下是上述功能介绍的重写版本&#xff1a; 装扮 使用丰富的材料&#xff0c;为您的房屋增添独特魅力&#xff0c;展现个性化装饰风格。 土地升级 投入不同数量的材料&#xff0c;提升房屋与土地的品质&#xff0c;打造独一无二的庄园。 日志 通过日志记录&#xff0c;清…

[Leetcode]用栈实现队列

用栈实现队列&#xff1a; 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元…

SQL优化——访问路径(ACCESS PATH)

文章目录 1、常见访问路径1.1、TABLE ACCESS FULL1.2、TABLE ACCESS BY USER ROWID1.3、TABLE ACCESS BY ROWID RANGE1.4、TABLE ACCESS BY INDEX ROWID1.5、INDEX UNIQUE SCAN1.6、INDEX RANGE SCAN1.7、INDEX SKIP SCAN1.8、INDEX FULL SCAN1.9、INDEX FAST FULL SCAN1.10、I…

AI的十大趋势如何?斯坦福《2024年人工智能指数报告》告诉你

最近&#xff0c;全球著名华人人工智能学者李飞飞联合领导的斯坦福大学以人为本人工智能研究所&#xff08;Stanford HAI&#xff09;发布了《2024 年人工智能指数报告》&#xff08;Artificial Intelligence Index Report 2024&#xff09;。 《2024 年人工智能指数报告》下载…

windows terminal屏幕分栏的打开和关闭快捷键

最近看的工程基于windows的&#xff0c;自学c语法基于vm里的Ubuntu&#xff0c;win的终端好难用&#xff0c;搞得我好分裂。win系统找到了一个还不错的终端程序&#xff0c;总是记不住常用的快捷键&#xff0c;就记录下。 &#xff08;安装也超简单&#xff0c;直接在MicroSoft…

Vmware 虚拟机自定义IP地址 - UbuntuServer2204

Vmware 虚拟机自定义IP地址 - UbuntuServer2204 设置网段 选择喜欢的网段&#xff0c; 例如&#xff1a; 166 自定义 IP地址 打开虚拟机&#xff0c; 输入命令查看网卡名 ip addr查看网卡配置文件 ls -al /etc/netplan/编辑网卡配置文件 sudo vim /etc/netplan/00-installe…

linux 的Jdk1.8详细安装部署教程

一、环境准备 1.下载安装包 下载地址&#xff0c;这是1.8的你也可以选择安装别的版本的 https://www.oracle.com/java/technologies/downloads/#java8-windows 选择想要的系统和对应的位数&#xff0c;点击下载即可 2.上传安装包 选择自己要安装的路径&#xff0c;&#x…

06—js函数(构造函数,原型,原型链。。。。。。)

一、初识函数 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。 通过函数可以封装任意多条语句&#xff0c;而且可以在任何地方&#xff0c;任何时间进行调用和执行 二、创建函数 &#xff08;1&#xff09;function命令&#xff0c; 使用关键词 function来声…

虚拟现实(VR)开发框架

虚拟现实&#xff08;VR&#xff09;开发框架为开发者提供了构建VR应用程序所需的基本工具和功能。它们通常包括3D引擎、场景图、输入系统、音频系统和网络功能。下面是一些流行的VR开发框架。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流…

借助 AI 对话文档:100% 私密且无数据泄漏 | 开源日报 No.224

zylon-ai/private-gpt Stars: 50.0k License: Apache-2.0 PrivateGPT 是一个可以与您的文档进行交互的项目&#xff0c;利用 GPT 的强大功能&#xff0c;100% 私密且无数据泄漏。 提供 API 支持构建私密、上下文感知的 AI 应用程序遵循和扩展 OpenAI API 标准支持普通和流式响…

51单片机实验04 -数码管的动态显示实验

目录 一、实验目的 二、实验内容 三、实验原理 四、实验方法 五&#xff0c;实验效果及代码 1&#xff0c;效果 2&#xff0c;代码 六&#xff0c;课后习题 1&#xff0c;使用定时器T0的中断函数1 从999999~0计时 1&#xff09;效果 2&#xff09;代码 2&#xff0c…

国内低代码平台大揭秘:十大排名榜单综述

国内低代码平台有&#xff1a;Zoho Creator、腾讯云云开发、阿里云宜搭、华为云AppCube、爱速搭、白码、织信、活字格、ClickPaaS、简道云。 一、Zoho Creator Zoho Creator是一款基于云计算的低代码平台&#xff0c;旨在帮助企业和开发者快速构建和部署应用程序。该平台提供…

论AEM CV-100 K50E|K60E|NSA升级注意事项

新加坡AEM公司在中国的平台深圳维信仪器报道&#xff1a;近日有很多小伙伴过来咨询&#xff0c;CV-100如何升级&#xff1f;都是想要使用最新的测试功能&#xff0c;比如上图的TDR高精度测试&#xff0c;可以准确的判定被测线缆的故障点。 5.0.307版本不含有tdr高精度测试&…

一键下载全自动安装Office全家桶

概述 今天分享一款超级强大的工具软件&#xff0c;该软件实现了一键自动化下载、安装Office全家桶的功能。整套安装流程堪称行云流水&#xff0c;从下载到安装全自动&#xff0c;无需上手操作。只需要安装该工具软件后&#xff0c;点击安装即可。软件会自动识别不同的操作系统架…

虹科技术丨全新Linux环境PCAN驱动程序发布!CAN/CAN FD通信体验全面升级!

来源&#xff1a;虹科汽车电子 虹科技术丨全新Linux环境PCAN驱动程序发布&#xff01;CAN/CAN FD通信体验全面升级&#xff01; 原文链接&#xff1a;https://mp.weixin.qq.com/s/4RXqjUa_odEaxAhcfQOHaA 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #PCAN #Linu…

《Linux运维总结:Kylin V10+ARM架构CPU基于docker-compose一键离线部署redis6.2.8之容器版哨兵集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面向不通的客户安装我们的业务系统&…

【linux】Ubuntu 修改用户名

第一次打开Ubuntu时不小心把初始用户名“siriusiot”写成“siriousiot”&#xff08;多了一个o&#xff09; 。作为技术人&#xff0c;我们要保持严谨&#xff0c;我们要纠正过来&#xff08;其实就是单词拼错了怕被笑话&#xff09;。 打开终端&#xff0c;输入&#xff1a; …

高效解决Visual Studio Code中文乱码问题

文章目录 问题解决步骤 问题 Visual Studio Code新建一个文件编码方式总是默认GBK&#xff0c;如果我不修改成默认UTF-8&#xff0c;那么每次运行&#xff0c;如果有中文需要输出就会乱码&#xff01; 解决步骤 之后我会持续更新&#xff0c;如果喜欢我的文章&#xff0c;请记…