阻塞队列_线程安全版本_生产消费者模型

news/2024/10/6 20:30:34 标签: java, 开发语言

前言

在前面PriorityQueue优先级队列_Y君的进化史的博客-CSDN博客,我们学习了优先级队列,但是发现,当一个线程将优先级队列使用完之后,会自动退出程序,如果此时我们想使其一直等待到下一个任务的录入,就需要通过阻塞的功能实现,于是就有了阻塞队列的诞生。

一、阻塞队列原理

  1. 当队列满时,继续入队列就会产生阻塞,直到其他线程从队列中取出元素为止;
  2. 当队列空时,继续出队列就会产生阻塞,直到其他线程往队列中添加元素为止。

Java标准库对于阻塞队列的实现:

java">BlockingQueue<Integer> queue1 = new LinkedBlockingQueue<>();
BlockingQueue<Integer> queue2 = new PriorityBlockingQueue<>();
BlockingQueue<Integer> queue3 = new ArrayBlockingQueue<>(12);//12 是指任务的最多数目

对于BlockingQueue,offer 和 poll 是不带阻塞功能的(因为BlockingQueue 继承 Queue),put 和 take 带阻塞功能的,这里的阻塞功能是使用wait-notify实现的。

二、生产消费者模型

(一)解耦合

通过引入阻塞队列,介绍了各处理器之间的联系,哪怕哪个机子先报废了,也不必担心其他机子受到太多的影响,起到了解耦合的作用。

 

(二)削峰填谷

原来的处理机制是,A传送一个信号,B就接收一个信号。若A服务器配置更好,A能承受的信号多,B能承受的信号少,该机制就会挂机。

但是通过阻塞队列的引入,不管A传送的信号是多还是少,B依旧能以自身的节奏去处理信号,起到了削峰填谷的作用。

 三、代码实现阻塞队列

java">//阻塞队列
class MyBlockingQueue{
    private String[] elem = new String[10];
    //头
    volatile private int head;
    //尾
    volatile private int end;
 
    //锁
    Object lock = new Object();
    //插入
    public void put(String tmp) throws InterruptedException {
        synchronized (lock){
            while((end+1)%elem.length == head){
                //队列满了,阻塞
                lock.wait();
            }
            elem[end] = tmp;
            end++;
            if(end >= elem.length){
                end = 0;
            }
            lock.notify();
        }
    }
 
    //出队列
    public String take() throws InterruptedException {
        synchronized (lock){
            while(end == head){
                //队列空的,出队列阻塞
                lock.wait();
            }
            String tmp = elem[head];
            head++;
            if(head >= elem.length){
                head = 0;
            }
            lock.notify();
            return tmp;
        }
    }
 
}


http://www.niftyadmin.cn/n/4937236.html

相关文章

内网穿透——使用Windows自带的网站程序建立网站

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中&#xff0c;搭建网页都会借助各种软件的帮助&#xff0c;比如…

手把手指点用piwigo与cpolar结合共同搭建一个能分享的旅行相册网站

文章目录 前言1. 使用piwigo这款开源的图片管理软件2. 需要将piwigi网页复制到phpstudy3. “开始安装”进入自动安装程序4. 创建新相册5. 创建一条空白数据隧道6.将cpolar云端保留的空白数据隧道与本地piwigo网页关联起来总结 前言 每逢节假日到各处去旅行&#xff0c;到不同的…

Redis的单线程与多线程

Redis的核心处理逻辑一直都是单线程 有一些分支模块是多线程(某些异步流程从4.0开始用的多线程&#xff0c;例如UNLINK、FLUSHALL ASYNC、FLUSHDB ASYNC等非阻塞的删除操作。网络I/O解包从6.0开始用的是多线程;) 为什么是单线程 多线程多好啊可以利用多核优势 官方给的解释 …

【React】精选10题

1.React Hooks带来了什么便利&#xff1f; React Hooks是React16.8版本中引入的新特性&#xff0c;它带来了许多便利。 更简单的状态管理 使用useState Hook可以在函数组件中方便地管理状态&#xff0c;避免了使用类组件时需要继承React.Component的繁琐操作。 避免使用类组件…

p7付费课程笔记7:G1 GC

目录 前言 什么是G1 GC? 重要语义讲解 标记过程 注意事项 适用场景分析 应用建议 问题 常用配置参数 前言 上次我们讲了CMS GC&#xff0c; 这次我们讲解G1 GC&#xff1b;在开始之前我们要思考下我们为什么学G1 GC?学习后有什么好处&#xff1f; 成为更好的Java开…

Vue2 实现购物车功能(可直接使用)

目录 vue2.0实例简单购物车代码实现 vue2.0实例简单购物车 页面展示效果如下&#xff1a;​ 该购物车实现了自动计算小计、总价。 代码实现 <body><div id"app"><div><form action"">商品名称:<input type"text" …

ChatGPT: 提升程序员开发效率的秘密武器!

引言 在现代软件开发中&#xff0c;时间和效率显得尤为重要。程序员们需要在尽可能短的时间内编写高质量的代码&#xff0c;并使之处于状态良好的维护周期。为满足这些需求&#xff0c;人工智能技术逐渐成为软件开发的一项核心能力。ChatGPT作为自然语言生成模型中的佼佼者&am…

关于PMP中的敏捷知识

在此次改版中&#xff0c;题目中增加了大量的敏捷题型&#xff0c;总体比重仍然很高&#xff0c;据我的主观感觉&#xff0c;达到了1/3。与ACP认证相比&#xff0c;PMP对敏捷管理技术的考察相对简单&#xff0c;考察路径也较为集中&#xff0c;主要聚焦于以下两个方面&#xff…