07_阻塞队列(BlockingQueue)

news2025/2/25 12:41:15

目录

1. 什么是BlockingQueue

2. 认识BlockingQueue

3. 代码演示


栈与队列概念

栈(Stack):先进后出,后进先出

队列:先进先出

1. 什么是BlockingQueue

在多线程领域:所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动被唤起。

BlockingQueue即阻塞队列,是java.util.concurrent下的一个接口,因此不难理解,BlockingQueue是为了解决多线程中数据高效安全传输而提出的。从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种:

  1. 当队列满了的时候进行入队列操作

  2. 当队列空了的时候进行出队列操作

因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被阻塞,除非有另一个线程做了出队列操作;同样,当一个线程试图对一个空队列进行出队列操作时,它将会被阻塞,除非有另一个线程进行了入队列操作。

阻塞队列主要用在生产者/消费者的场景,下面这幅图展示了一个线程生产、一个线程消费的场景:

为什么需要BlockingQueue?

好处是我们不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,因为这一切BlockingQueue都给你一手包办了。在concurrent包发布以前,在多线程环境下,我们每个程序员都必须去自己控制这些细节,尤其还要兼顾效率和线程安全,而这会给我们的程序带来不小的复杂度。

2. 认识BlockingQueue

java.util.concurrent 包里的 BlockingQueue是一个接口,继承Queue接口,Queue接口继承 Collection。

BlockingQueue接口主要有以下7个实现类:

  1. ArrayBlockingQueue:由数组结构组成的有界阻塞队列。

  2. LinkedBlockingQueue:由链表结构组成的有界(但大小默认值为integer.MAX_VALUE)阻塞队列。

  3. PriorityBlockingQueue:支持优先级排序的无界阻塞队列。

  4. DelayQueue:使用优先级队列实现的延迟无界阻塞队列。

  5. SynchronousQueue:不存储元素的阻塞队列,也即单个元素的队列。

  6. LinkedTransferQueue:由链表组成的无界阻塞队列。

  7. LinkedBlockingDeque:由链表组成的双向阻塞队列。

BlockingQueue接口有以下几个方法:它的方法可以分成以下4类:

抛出异常特殊值阻塞超时
插入add(e)offer(e)put(e)offer(e, time, unit)
移除remove()poll()take()poll(time, unit)
检查element()peek()不可用不可用

① 抛出异常

add正常执行返回true,element(不删除)和remove返回阻塞队列中的第一个元素​ 当阻塞队列满时,再往队列里add插入元素会抛IllegalStateException:Queue full​ 当阻塞队列空时,再往队列里remove移除元素会抛NoSuchElementException​ 当阻塞队列空时,再调用element检查元素会抛出NoSuchElementException。

② 特定值

插入方法,成功ture失败false 移除方法,成功返回出队列的元素,队列里没有就返回null 检查方法,成功返回队列中的元素,没有返回null。

③ 一直阻塞

如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行。​ 当阻塞队列满时,再往队列里put元素,队列会一直阻塞生产者线程直到put数据or响应中断退出​ 当阻塞队列空时,再从队列里take元素,队列会一直阻塞消费者线程直到队列可用。

④ 超时退出

如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行,但等待时间不会超过给定值。​ 返回一个特定值以告知该操作是否成功(典型的是 true / false)。

3. 代码演示

public class BlockingQueueDemo {

    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<String> queue = new ArrayBlockingQueue<>(3);
        // 第一组方法:add remove element
//        System.out.println(queue.add("a"));
//        System.out.println(queue.add("b"));
//        System.out.println(queue.add("c"));
//        // System.out.println(queue.add("d"));
//        // System.out.println(queue.element());
//        System.out.println(queue.remove());
//        System.out.println(queue.remove());
//        System.out.println(queue.remove());
//        //System.out.println(queue.remove());
//        //System.out.println(queue.element());
        // 第二组:offer poll peek
//        System.out.println(queue.offer("a"));
//        System.out.println(queue.offer("b"));
//        System.out.println(queue.offer("c"));
//        System.out.println(queue.offer("d"));
//        System.out.println(queue.peek());
//        System.out.println(queue.poll());
//        System.out.println(queue.poll());
//        System.out.println(queue.poll());
//        System.out.println(queue.poll());
//        System.out.println(queue.peek());
        // 第三组:put take
//        queue.put("a");
//        queue.put("b");
//        queue.put("c");
//        System.out.println(queue.take());
//        queue.put("d");
//        System.out.println(queue.take());
//        System.out.println(queue.take());
//        System.out.println(queue.take());
        // 第四组:offer poll
        System.out.println(queue.offer("a"));
        System.out.println(queue.offer("b"));
        System.out.println(queue.offer("c"));
        System.out.println(queue.offer("d", 5, TimeUnit.SECONDS));
    }
}

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

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

相关文章

JVM 基本知识

目录 前言 一、JVM 内存区域划分 1.1 程序计数器 1.2 栈 1.3 堆 1.4 方法区 二、 JVM 类加载机制 2.1 类加载需要经过的几个步骤 2.1.1 Loading - 加载 2.1.2 Linking - 连接 2.1.3 initialization&#xff08;初始化&#xff09; 小结 经典面试题 三、JVM 垃圾…

天河新一代,安装OpenCV

1&#xff09;下载 Releases opencv/opencv GitHub 下载一个版本&#xff0c;传上去。 解压&#xff0c;因为只要最基本的功能&#xff0c;所以不需要ctri等包。 2&#xff09; 一些选项 cmake .. -D<选项名1><设定值1> -D<选项名2><设定值2> …

Metasploit Framework-安全漏洞检测工具使用

一款开源的安全漏洞检测工具&#xff0c;简称MSF。可以收集信息、探测系统漏洞、执行漏洞利用测试等&#xff0c;为渗透测试、攻击编码和漏洞研究提供了一个可靠平台。 集成数千个漏洞利用、辅助测试模块&#xff0c;并保持持续更新。 由著名黑客、安全专家H.D. Moore主导开发…

Hadoop学习笔记(二)环境配置与服务器克隆

VMware与Centos7的安装 这部分很简单&#xff0c;只需要按照常规步骤一步一步安装即可。最后出现如下画面便完成了。 如果出现了一打开 “开启虚拟机” 就蓝屏的情况。可以试试将VMware更新到16的版本以上。 对虚拟机进行一系列的设置 设置VMware的IP地址 接下来点击 “NAT设…

计算任意时间内课时出现次数以及冲突情况判断

背景 整体由四部分组成&#xff0c;报名时间、报名周期、上课时间、上课周期 通过选择报名时间、报名周期、以及上课时间&#xff0c;去计算在培训周期内总的培训课时&#xff0c;并当上课时间冲突时&#xff0c;给出提示。 需求&#xff1a; 报名时间&#xff08;日期时分&…

分享10个非常好用的绘图工具

无论你是一个专业的插画师&#xff0c;还是一个有创造力的人&#xff0c;想要随时记录生活的灵感&#xff0c;现在你只需要拿起平板电脑或打开电脑浏览器来描述你脑海中的图片。在本文中&#xff0c;我们选择了10个强大、方便、易于使用的在线绘图软件&#xff0c;其中一个必须…

人工智能之配置环境教程一:安装VsCode和Anaconda

人工智能之配置环境教程一&#xff1a;安装VsCode和Anaconda 作者介绍一&#xff0e; 安装VScode编辑器二. 安装Anaconda 作者介绍 孟莉苹&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2021级硕士研究生&#xff0c;张宏伟人工智能课题组。 研究方向&#…

语音特征工程—时域分析

当下主流语音前端算法在特征工程方面&#xff0c;从vad&#xff0c;降噪、降混响到盲源分离&#xff0c;无论是传统做法还是NN做法&#xff0c;大多基于频域。但近年在语音分离领域也看到了利用时域的做法&#xff0c;也取得了不错的效果。 本文从特征工程的角度&#xff0c;对…

jQuery购物车案例模块

<div class"car-header"><div class"w"><div class"car-logo"><img src"img/logo.png" alt""> <b>购物车</b></div></div></div></div><div class"c-…

研究了一个多月ChatGPT我发现了这些!!AI时来了?

好久都没有更新过博客了&#xff0c;大一下是真的很忙碌&#xff0c;属实是真的要崩溃了&#xff0c;但是博主还是坚强的活了下来&#xff0c;好了&#xff0c;进入正题&#xff0c;博主使用了一段时间的chatGPT发现真的可能AI时代将要来临&#xff0c;原本以为gpt能做网页已经…

二十三种设计模式第一篇-设计模式的原则和分类

怎么说&#xff0c;其实我挺讨厌设计模式的&#xff0c;但是不得不说&#xff0c;这东西解决问题确实有一手&#xff0c;并且设计模式确实规范了我们在开发中的代码&#xff0c;并且我们可以使用这二十三种设计模式解决我们碰到的业务问题&#xff0c;并且我们学的框架里边多多…

利用Python操作Mysql数据库

我们在进行Python编程的时候&#xff0c;时常要将一些数据保存起来&#xff0c;其中最方便的莫过于保存在文本文件了。但是如果保存的文件太大&#xff0c;用文本文件就不太现实了&#xff0c;毕竟打开都是个问题&#xff0c;这个时候我们需要用到数据库。提到数据库&#xff0…

怎样从零开始编译一个魔兽世界开源服务端Windows

怎样从零开始编译一个魔兽世界开源服务端Windows 第二章&#xff1a;编译和安装 我是艾西&#xff0c;上期我们讲述到编译一个魔兽世界开源服务端环境准备&#xff0c;那么今天跟大家聊聊怎么编译和安装我们直接进入正题&#xff08;上一章没有看到的小伙伴可以点我主页查看&…

haproxy负载均衡+keepalived高可用

LVS和haproxy、nginx做负载均衡时的区别 调度算法 LVS:轮询(rr)、加权轮询(wrr)、最少连接(lc)、加权最少连接(wlc)、源地址哈希值(sh)、目的地址哈希&#xff08;dh&#xff09; haproxy:轮询&#xff08;roundrobin)、加权轮询&#xff08;static-rr)、最少连接&#xff08…

2023有潜力的新药都有哪些?新药筛选方法总结

2023有潜力的新药都有哪些&#xff1f;这是一道蕴含无限可能性和未知挑战的问题。新药研发是制药公司不断追求的目标&#xff0c;每一次成功都可以带来巨额利润&#xff0c;改善患者生命质量&#xff0c;成就公司声誉。但与此同时&#xff0c;新药研发风险也是极大的&#xff0…

电梯导航栏的实现

点击跳到指定位置类似于电梯导航 .w {width: 1200px;margin: 0 auto; } .fixedtool {position: fixed;top: 100px;left: 50%;margin-left: -676px;width: 66px;background-color: #fff;display: none; }.fixedtool li {height: 32px;line-height: 32px;text-align: center;fo…

基于dsp+fpga的半导体运动台高速数据采集FPGA endac设计(三)

EnDat 双向串行通信协议的实现 数据&#xff08;测量值或参数&#xff09;可以在位置编码器和 EnDat 协议内核之间进行双向传输&#xff0c; EnDat 协议内核的收发单元支持 RS-485 差分信号传输&#xff0c;数据传输与传感伺服控制系统 生成的时钟脉冲同步。传输的数据…

如何将Postman API测试转换为JMeter以进行扩展

许多测试工程师使用Postman进行API测试自动化。他们发现端点&#xff0c;发出请求&#xff0c;创建测试数据&#xff0c;运行回归测试&#xff0c;使用Newman等实现API测试的持续集成。但是&#xff0c;Postman有一定的测试限制。希望获得更多负载测试能力的开发人员&#xff0…

系统集成项目管理工程师 笔记(第10章:项目质量管理)

文章目录 10.1.2 质量管理及其 发展史 35610.1.3 项目质量管理 35810.2.2 规划质量管理的输入 35910.2.3 规划质量管理的工具与技术 3601、成本效益分析法2、质量成本法&#xff08;一致性成本【预防、评价】 和 非一致性成本【内部、外部】&#xff09;3、七种基本质量工具&am…

数字设计小思 - 谈谈时钟:数字系统的心脏

前言 本系列整理数字系统设计的相关知识体系架构&#xff0c;为了方便后续自己查阅与求职准备。时钟作为数字系统中的“心脏”&#xff0c;其设计的质量好坏直接关乎整个系统的稳定性&#xff0c;本文主要介绍了数字设计中的常见的时钟产生电路和时钟类型&#xff0c;并进行相…