Java集合类学习--BlockingQueue

BlockingQueue(阻塞队列)详解 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。 立即下载

概述

BlockingQueue 意为“阻塞队列”,它在 JDK 中是一个接口。

所谓阻塞,简单来说就是当某些条件不满足时,让线程处于等待状态。例如经典的“生产者-消费者”模型,当存放产品的容器满的时候,生产者处于等待状态;而当容器为空的时候,消费者处于等待状态。阻塞队列的概念与该场景类似。

在这里插入图片描述
BlockingQueue 继承自 Queue 接口,它的常用实现类有 ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue 等。

源码分析

方法定义:
在这里插入图片描述
用法分析:

// 将指定元素插入到队列,若成功返回 true,否则抛出异常
boolean add(E e);

// 将指定元素插入到队列,若成功返回 true,否则返回 false
boolean offer(E e);

// 将指定元素插入到队列,若队列已满则等待
void put(E e) throws InterruptedException;

// 将指定元素插入到队列,若成功返回 true,否则返回 false,有超时等待
boolean offer(E e, long timeout, TimeUnit unit)
    throws InterruptedException

// 获取并移除队列的头部,若为空则等待
E take() throws InterruptedException;

// 获取并移除队列的头部,有超时等待(若超时返回 null)
E poll(long timeout, TimeUnit unit)
    throws InterruptedException;

// 返回队列可以接收的容量,若无限制则返回 Integer.MAX_VALUE
int remainingCapacity();

// 删除指定的元素(如果存在),返回是否删除成功
boolean remove(Object o);

// 是否包含指定元素
public boolean contains(Object o);

// 从此队列中删除所有可用元素,并将它们添加到给定集合中
int drainTo(Collection<? super E> c);

// 从此队列中删除所有可用元素,并将它们添加到给定集合中(指定大小)
int drainTo(Collection<? super E> c, int maxElements);

与前面学的Queue相比,多了几个带有超时的方法,学习一下即可。

小结

阻塞与非阻塞

入队
offer(E e):如果队列没满,立即返回true; 如果队列满了,立即返回false–>不阻塞
put(E e):如果队列满了,一直阻塞,直到队列不满了或者线程被中断–>阻塞
offer(E e, long timeout, TimeUnit unit):在队尾插入一个元素,,如果队列已满,则进入等待,直到出现以下三种情况:–>阻塞
被唤醒
等待时间超时
当前线程被中断

出队
poll():如果没有元素,直接返回null;如果有元素,出队
take():如果队列空了,一直阻塞,直到队列不为空或者线程被中断–>阻塞
poll(long timeout, TimeUnit unit):如果队列不空,出队;如果队列已空且已经超时,返回null;如果队列已空且时间未超时,则进入等待,直到出现以下三种情况:
被唤醒
等待时间超时
当前线程被中断

阻塞队列在并发编程中使用较多,比如线程池。

不接受 null 元素。试图 add、put 或 offer 一个 null 元素时,某些实现会抛出 NullPointerException。null 被用作指示 poll 操作失败的警戒值。
可以是限定容量的。它在任意给定时间都可以有一个 remainingCapacity,超出此容量,便无法无阻塞地 put 附加元素。没有任何内部容量约束的 BlockingQueue 总是报告Integer.MAX_VALUE 的剩余容量。
实现主要用于生产者-使用者队列,但它另外还支持 Collection 接口。因此,举例来说,使用 remove(x) 从队列中移除任意一个元素是有可能的。然而,这种操作通常不 会有效执行,只能有计划地偶尔使用,比如在取消排队信息时。
实现是线程安全的。所有排队方法都可以使用内部锁或其他形式的并发控制来自动达到它们的目的。然而,大量的 Collection 操作(addAll、containsAll、retainAll 和removeAll)没有 必要自动执行,除非在实现中特别说明。因此,举例来说,在只添加了 c 中的一些元素后,addAll© 有可能失败(抛出一个异常)。

短视频团队架构&工作流程---2025.3.30 1、负责短视频日常内容分发上线,包括视频头图、标题、简介、推荐位及部分内容元数据的日常导入、审核、上线、下线,并提供各品类短视频的内容上线计划表。(20)运营:视频推送后,实时跟进视频数据,定期统计分析数据报表,根据数据表现 找到问题,并发送给各个小组的负责人,对下一期视频内容进行调整。(4)运营:收到成片,设计视频头图、标题、简介、推荐位等,分发到各个平台,统计分析视频的数据,对各个平台的视频进行管理、用户互动等。1、负责影视、戏剧、广告、专题片等的策划、组稿选题、材料收集、内容策划。 阅读详情

相关推荐

记录rk3588 在Linux 6.1内核版本声卡 bug。

rk3588 Audio bug

Yongheng6的博客 855

Java集合(五)BlockingQueue的常用实现类

BlockingQueue(阻塞队列)、ArrayBlockingQueue(数组版阻塞队列)、LinkedBlockingQueue(链表版阻塞队列)、PriorityBlockingQueue(排序版阻塞队列)

HK的博客 1271

伪傻瓜式安装sql server2008【附带安装包】

安装各式各样的软件无疑是学习过程中…较…为烦躁的一部分 木有醋 但还是开始吧 为什么这是伪呢? 因为刚开始天真无邪的我真的是傻瓜式安装(迷之自信),结果就B了(打开配置管理器的瞬间….一片空白) BaiduCloud分享 红领巾在何方?? Link链接:https://pan.baidu.com/s/1NZCxP0Y27dBPrgHoRWLDyQ...

EuniBoom的博客 6万+

BlockingCollection的基础使用

BlockingCollection就是一个线程安全的阻塞队列,利用阻塞这个特性,我们可以实现进程内的生产者-消费者模式,比如消息转发、日志记录等。

Major_S的博客 828

毫米波雷达dd-mimo中发射天线辐射方向图变化

本文详细介绍了dd-mimo的相位调制原理,以及分离天线的办法,最后演示了在dd-mimo中因为相位调制带来的辐射方向图的变化。

weixin_44555637的博客 1167

高温环境下RS485通信故障分析与MOS管解决方案

RS485通信作为工业控制领域的基础总线技术,其可靠性直接影响系统稳定性。在高温等恶劣环境下,传统三极管开关电路会因温度特性导致通信故障。通过分析三极管Ube电压随温度变化的特性,揭示了电路失效的物理原理。相比之下,MOS管作为电压控制型器件,具有温度稳定性好、功耗低等优势,更适合工业环境应用。本文通过一个发动机舱内RS485通信故障的实际案例,详细对比了三极管与MOS管在高温环境下的性能差异,并给出了具体的电路改进方案。该案例对工业通信接口设计具有普遍参考价值,特别适用于需要应对高温、振动等挑战性环境的硬

weixin_42612405的博客 405

Java ~ Collection/Executor ~ BlockingQueue【总结】

从本质上说,BlockingQueue(阻塞队列)接口(下文简称阻塞队列)应该属于Collection(集)框架的范畴,因为其继承了Queue(队列)接口。但由于其大多数情况都被用于容纳/管理执行器中的任务,因此通常都被划分到Executor(执行器)框架的范畴中。 阻塞队列最大的特点是阻塞(这应该一眼就能看出来...),换句话说,其定义上是线程安全的,即实现无论采用了何种实现方式,都必须保证线程安全。 阻塞队列不允许存null值。 阻塞队列可能存在容量限定,这种阻塞队列被称为有界队列.

说淑人的所思所想 535

Fanuc机器人的坐标变换矩阵的研究2

一、Funuc用户坐标系的介绍 二、用户坐标系与世界坐标系的坐标转换 三、 以用户坐标系1为基础旋转变换后的用户坐标系 四、关于点的WPR的含义 4.1:点在用户坐标系和世界坐标系下的坐标关系 4.2 通过转换矩阵返回去推导WPR

qq_34047402的博客 1523

34.Java 阻塞队列(阻塞队列架构、阻塞队列分类、阻塞队列核心方法)

34.Java 阻塞队列(阻塞队列架构、阻塞队列分类、阻塞队列核心方法)

weixin_52173250的博客 1054

ADRV9009学习资料保存:基于XC7Z100+ADRV9009的双收双发无线电射频板卡

ADRV9009学习资料保存:基于XC7Z100+ADRV9009的双收双发无线电射频板卡 一、板卡概述 基于XC7Z100+ADRV9009的双收双发无线电射频板卡是基于XilinxZYNQFPGA和ADI的无线收发芯片ADRV9009开发的专用功能板卡,用于5G小基站,无线图传,数据收发...

9356

从RadixTree到哈希表:深入对比SGLang和vLLM的Prefix Cache实现差异

本文深入对比了SGLang与vLLM在大语言模型推理服务中实现Prefix Cache(前缀缓存)的两种核心方案。SGLang采用基于Radix Tree的RadixAttention,支持任意长度前缀的精确匹配与灵活复用;vLLM则采用基于哈希表的方案,深度集成于PagedAttention,实现简洁但要求块级精确对齐。文章剖析了二者在设计哲学、内存管理、适用场景及集群级优化(如Prefix Cache Aware Routing)上的关键差异,为高性能LLM服务的技术选型提供决策依据。

blockchain9miner的博客 955

深入理解阻塞队列

阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 先放张图: 根据前面的描述, 我们来考虑下阻塞...

anfeng4628的博客 171

全网详细解决Client does not support authentication protocol requested by server;consider upgrading Mysql c

全网详细解决1251 - Client does not support authentication protocol requested by server; consider upgrading Mysql client。

念兮为美 5476

Java集合面试题(三)(附答案详解)

【版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任】 【创作不易,点个赞就是对我最大的支持】 前言 学习笔记,供大家参考 每篇更新10道高频Java集合面试题 文章目录前言1.HashMap和HashTable有何不同?2.如何决定选用HashMap还是TreeMap?3.ArrayList和Vector有何异同点?4.Array和ArrayList有何区别?什么时候更适合用Array?5.ArrayList和LinkedList有何区别?6.哪些集合类提供对元素的随机访问?7.En.

xiao___tao的博客 387

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java中的线程安全的集合类(如果想知道Java中有关线程安全的集合类的知识,那么只看这一篇就足够了!)

Java中的线程安全的集合类(如果想知道Java中有关线程安全的集合类的知识,那么只看这一篇就足够了!)

秋刀鱼不做梦的编程日常 7989

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java集合类面试题

参考答案它基于hash算法,通过put方法和get方法存储和获取对象。存储对象时,我们将K/V传给put方法时,它调用K的hashCode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前bucket的占用情况自动调整容量(超过Load Facotr则resize为原来的2倍)。获取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,并进一步调用 equals()方法确定键值对。

qq_45270148的博客 1362

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【Java基础】-【集合类】

在调整大小的过程中,存储在链表中的元素的次序会反过来,因为移动到新的bucket位置的时候,HashMap并不会将元素放在链表的尾部,而是放在头部,这是为了避免尾部遍历。所以即便是需要使用线程安全的集合类,也建议将线程不安全的集合类包装成线程安全集合类的方式,而不是直接使用这些古老的API。从Java5开始,Java在。这个设计确实非常的巧妙,既省去了重新计算hash值的时间,而且同时,由于新增的1bit是0还是1可以认为是随机的,因此resize的过程,均匀的把之前的冲突的节点分散到新的bucket了。

CaraYQ的博客 2096

Java中的线程安全集合类

线程安全集合类 包括: StringBuffer: 线程安全 String: 不可变的类 , 都线程安全 Random: 线程安全 Vector: 实现了List,并且线程安全 Hashtable: ...

qq_42068654的博客 2526

Java 中一些常见的同步集合类

同步集合是指在多线程环境中可以安全使用的集合,这些集合在内部实现了同步机制,以确保多个线程对集合的同时访问不会导致数据不一致或其他并发问题。同步集合通过对公共方法(如add()remove()iterator()等)进行同步处理,来确保集合在任何时候都保持一个一致的状态。VectorVector是一个实现了可增长的对象数组,与ArrayList类似,但它是线程安全的。Vector的每个方法都是同步的,这意味着它是线程安全的,但性能上可能不如非同步的集合。

不安分的猿人的专栏 1065

Java中的并发集合类及其线程安全实现

Java中的并发集合类为多线程编程提供了强大的支持,通过合理的选择和使用这些集合类,可以显著提高程序的性能和可靠性。

Java开发者,专注后端技术分享,深耕框架实战与架构优化,持续输出优质技术干货。 1003

【Java教程】Day15-15 多线程:线程同步——Java并发集合与BlockingQueue

在前面的教程中,我们已经通过ReentrantLock和Condition实现了一个简单的BlockingQueue。今天我们将深入探讨 Java 中的线程安全集合以及如何通过标准库中的并发集合简化多线程编程。

max202011161630的博客 457

java集合类面试题

java集合类面试题 1.请聊一下java的集合类,以及在实际项目中你是如何用的? 注意说出集合体系,常用类,接口,实现类 加上你所知道的高并发集合类,JUC 在实际项目中引用,照实说就好了 2.集合类是怎么解决高并发中的问题? 线程非全的集合类ArrayList LinkedList HashSet TreeSet HashMap TreeMap 实际开发中我们自己用这样的集合最多,因为一般我们自己写的业务代码中,不太涉及到多线程共享同一个集合的问题 线程安全的集合类Vector HashTable

xiaotai1234的博客 1754

【多线程】多线程下使用集合类

多线程下使用ArrayList/队列/哈希表

m0_74105656的博客 1471

Java集合类总结

1、概述 集合是Android开发比较重要的知识点,数据集合是同来存储数据的容器,通过容器给提供的接口可对容器中的数据进行增删查改。为了满足开发者的不同需要,JDK提供多种类型的集合,这里我们整理了一下Java 提供的集合类,便于以后的记忆。 把众多的集合类划分为两大类。 即非键值对的存储集合 在存储数据时提供一个Key,即以Key-Value键值对的方式存储 两种类型的集合分别实现下...

小包的博客 414

线程安全的集合类

的方法,即当发现需要扩容时,创建一个新的数组,同时搬运几个元素过去,后续每次线程操作ConcurrentHashMap时,都会搬运元素,每次操作搬运一部分元素。,当读取顺序表时,此时无线程安全问题,而当有线程要修改其中的值时,就会将list复制一份,修改新表中的内容,并修改引用的指向(操作是原子的,无需加锁)因此,针对读取操作,无需加锁,不同链表的操作,也无需加锁,而当针对同一链表操作时,需要加锁,此时,我们可以考虑使用。哈希表中本就需要有数组,数组的元素都是已经存在的(每个链表的头节点),此时,只需。

2301_76161469的博客 1593

Java 集合类 笔记总结 + 作业

Java collection 集合类

zxcsjf的博客 392
上一篇: Java集合类学习--LinkedList
下一篇: Java集合类学习--ArrayBlockingQueue
CodersCoder
博客等级 码龄10年 90粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值