Java 阻塞队列与生产者消费者模型

一、阻塞队列

阻塞队列是⼀种特殊的队列,其也遵守队列 "先进先出" 的原则;

阻塞队列是⼀种线程安全的数据结构,并且具有以下特性:

当队列满的时候,继续入队列就会阻塞,直到有其他线程从队列中取走元素;

当队列空的时候,继续出队列也会阻塞,直到有其他线程往队列中插⼊元素;

阻塞队列的⼀个典型应用场景就是 "⽣产者消费者模型",这是⼀种非常典型的开发模型;

二、生产者消费者模型

生产者消费者模型就是通过⼀个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取;

使用阻塞队列实现生产者消费者模型的好处:

1. 阻塞队列就相当于⼀个缓冲区,平衡了生产者和消费者的处理能力;(削峰填谷)

2. 阻塞队列也能使生产者和消费者之间解耦合;

Java 标准库中的阻塞队列:

BlockingQueue 是⼀个接口,真正实现的类是 LinkedBlockingQueue,ArrayBlockingQueue,PriorityBlockingQueue 等;

put 方法用于阻塞式的入队列,take 用于阻塞式的出队列,BlockingQueue 也有 offer,poll,peek 等方法,但是这些方法并不带有阻塞特性;

下面就来实现一个阻塞队列,并基于该阻塞队列实现生产者消费者模型;

public class MyBlockingQueue {
    private int[] items = new int[10000];
    private volatile int size = 0;
    private volatile int head = 0;
    private volatile int tail = 0;

    /**
     * 实现进队列
     * @param value value
     * @throws InterruptedException e
     */
    public synchronized void put(int value) throws InterruptedException {
        while (size == items.length){
            this.wait();
        }
        items[tail] = value;
        tail = (tail + 1) % items.length;
        size++;
        notifyAll();
    }

    /**
     * 实现出队列
     * @return value
     * @throws InterruptedException e
     */
    public synchronized int take() throws InterruptedException {
        while (size == 0){
            this.wait();
        }
        int tmp = items[head];
        head = (head + 1) % items.length;
        size--;
        notifyAll();
        return tmp;
    }

    public static void main(String[] args) throws InterruptedException {
        MyBlockingQueue blockingQueue = new MyBlockingQueue();
        Thread customer = new Thread(() -> {
            while (true){
                try {
                    int value = blockingQueue.take();
                    System.out.println("消费者消费 " + value);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });

        Thread producer = new Thread(() -> {
            while (true){
                try {
                    int value = new Random().nextInt(100);
                    blockingQueue.put(value);
                    System.out.println("生产者生产 " + value);
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        customer.start();
        producer.start();
        customer.join();
        producer.join();
    }
}

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

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

相关文章

成都市酷客焕学新媒体科技有限公司:助力品牌打破困境!

在数字化浪潮的推动下,营销策略对品牌的发展愈发关键。成都市酷客焕学新媒体科技有限公司,作为短视频营销领域的佼佼者,凭借其卓越的策略和实力,助力众多品牌在信息海洋中脱颖而出,实现品牌的显著增长。 酷客焕学专注于…

抖音和快手哪个好?来全面了解一下他们的区别!

快手和抖音虽然是短视频领域的两大主流平台,但是两者也存在本质的区别,从产品定位、用户群体到视频风格、变现模式,它们的特征都不一样。 (一)两个平台核心区别: 1. 核心用户不一样:抖音以1、…

【最优化方法】实验四 约束最优化方法的MATLAB实现

实验的目的和要求:通过本次实验使学生较为熟练使用MATLAB软件,并能利用该软件进行约束最优化方法的计算。 实验内容: 1、罚函数法的MATLAB实现 2、可行方向法的MATLAB实现 学习建议: 本次实验就是要通…

942. 增减字符串匹配 - 力扣

1. 题目 由范围 [0,n] 内所有整数组成的 n 1 个整数的排列序列可以表示为长度为 n 的字符串 s &#xff0c;其中: 如果 perm[i] < perm[i 1] &#xff0c;那么 s[i] I 如果 perm[i] > perm[i 1] &#xff0c;那么 s[i] D 给定一个字符串 s &#xff0c;重构排列 pe…

新能源汽车推行精益生产:绿色动力下的效率革命

在新能源汽车行业迅猛发展的当下&#xff0c;推行精益生产已成为提升竞争力的关键所在。精益生产&#xff0c;作为一种以客户需求为导向、追求流程最优化和浪费最小化的管理理念&#xff0c;正逐步在新能源汽车领域展现出其独特的魅力。 新能源汽车的兴起&#xff0c;不仅代表了…

【云原生】kubernetes中Configmap原理解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Python中tkinter入门编程9

在《Python中tkinter编程入门8-CSDN博客》中提到&#xff0c;tkinter中的Canvas表示画布&#xff0c;可以在画布中显示文字和图片。除了以上功能外&#xff0c;还可以在Canvas中添加对鼠标或键盘的响应。 1 为Canvas添加事件响应 可以通过Canvas的bind()方法添加对鼠标或键盘…

深圳比创达电子|EMC与EMI滤波器:电子设备的“电磁防护罩”

在电子科技日新月异的今天&#xff0c;电磁兼容性&#xff08;EMC&#xff09;问题越来越受到工程师和技术人员的关注。其中&#xff0c;电磁干扰&#xff08;EMI&#xff09;和电磁干扰抑制&#xff08;即EMI滤波器&#xff09;是实现良好EMC性能的关键技术之一。 一、EMC与E…

1218. 最长定差子序列

1218. 最长定差子序列 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;_1218最长定差子序列 错误经验吸取 原题链接&#xff1a; 1218. 最长定差子序列 https://leetcode.cn/problems/longest-arithmetic-subsequence-of-given-differen…

FlashRAG

文章目录 一、关于 FlashRAG特点 ✨&#x1f527; 安装 二、快速入门&#x1f3c3;1、Toy Example2、使用现成的管道3、建立自己的管道4、只需使用组件 三、组件⚙️1、RAG 组件2、管道 四、支持方法&#x1f916;五、支持数据集&#x1f4d3;六、其他常见问题解答 &#x1f64…

MT3049 区间按位与

思路&#xff1a; 使用ST表。ST表模板可参考MT3024 maxmin 注意点&#xff1a;此题范围较大&#xff0c;所以要避免超时。 ①使用 ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); 加快输入输出速度。 ②换行使用\n而不是endl 代码&#xff1a; 1.暴力6/8 #…

图片怎么批量重命名从1到50?这3个方法一键改名

图片怎么批量重命名从1到50&#xff1f;图片批量重命名从1到50的过程不仅提高了我们处理大量图片文件的效率&#xff0c;还大大简化了命名过程&#xff0c;让我们能更加有条理地管理和存储图片。通过使用各种专业的工具和方法&#xff0c;我们可以轻松实现图片文件的自动化命名…

微信小程序代码加固教程后台接口防止别人乱调用

最近开发了一个小程序前端开发前端和后台花了1个多月时间开发&#xff0c;结果被人轻松的把微信小程序前端代码破解出来。而且完整一个字不差截图给我看了。 小程序是前后端都分离的&#xff0c;如果后端不作验证&#xff0c;别人把你的小程序前端扒了接口也暴露了&#xff0c;…

玩转STM32-通用同步/异步收发器USART(详细-慢工出细活)

CPU与外围设备之间的信息交换或计算机与计算机之间的信息交换称为通信。基 本的通信方式有两种&#xff0c;即并行通信和串行通信。文章目录 一、串行通信基础1.1 串行通信的方式1.2 串行通信的数据传输形式1.3 波特率 二、STM32的USART的结构特征&#xff08;了解&#xff09;…

现在怎么做抖店才能赚钱?这四个重要建议,你千万不能忽略!

大家好&#xff0c;我是电商花花。 现在目前看抖音小店前景和红利依然有很大的市场空间&#xff0c;抖音小店平台流量大&#xff0c;商家入驻门槛低&#xff0c;抖店的运营技术也不像其它传统电商平台那么高。 所以&#xff0c;当下抖音小店仍然是流量大&#xff0c;机遇多。…

使用手机短信恢复软件,完成从新手到专家的进阶之路

由于各种原因&#xff0c;如误删、手机设备损坏等&#xff0c;我们可能会面临重要短信丢失的风险。现在市面上有许多手机短信恢复软件可以帮助我们解决这个问题&#xff0c;但从新手到专家的进阶之路并非一蹴而就的过程&#xff0c;它需要耐心、实践和不断地学习。以下是一篇关…

开源集运wms系统

集运WMS系统是一种专为集运业务设计的仓库管理系统&#xff0c;它能够高效地处理来自多个来源的货物&#xff0c;优化存储和发货流程。 经过长时间的开发和测试&#xff0c;推出了我的集运WMS系统。它不仅具备传统WMS系统的所有功能&#xff0c;还针对集运业务的特点进行了特别…

【JavaScript】ECMAS6(ES6)新特性概览(二):解构赋值、扩展与收集、class类全面解析

&#x1f525; 个人主页&#xff1a;空白诗 &#x1f525; 热门专栏&#xff1a;【JavaScript】 文章目录 &#x1f33f; 引言五、 Destructuring Assignment - 解构赋值&#xff0c;数据提取的艺术 &#x1f3a8;&#x1f4cc; 数组解构&#x1f4cc; 对象解构&#x1f4cc; 特…

matlab生成波形然后采样,FPGA写testbench读取数据

一、在matlab产生激励 fs1000; % 这个是路数 M16; % 这个是FFT的点数&#xff0c;64K L65536; % 将N写为两个整数乘积的形式&#xff0c;即N ML&#xff0c;(log2 M和log2 L都为正整数) NM*L; % 这段 MATLAB 代码是用来生成一个时间序列的&#xff0c; % 该时间序列从0开…

一次性把“AI 原生应用技术栈”说明白

AI 当前有多火爆不用介绍了&#xff0c;随着各个厂商的努力&#xff0c;也慢慢浮现了有价值的应用&#xff0c;以及为更好的服务 AI 原始应用准备的各种平台产品。今天这篇简单介绍下当前业界最新的 AI 原生应用技术栈。 特别声明&#xff1a;AI 技术还在快速发展过程中&#…