Java阻塞队列之BlockingQueue

Java多线程-阻塞队列BlockingQueue Java多线程之阻塞队列 阅读详情

阻塞队列BlockingQueue

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

jdk提供的有7个阻塞队列:
  • ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。
  • LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。
  • PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
  • DelayQueue:一个使用优先级队列实现的无界阻塞队列。
  • SynchronousQueue:一个不存储元素的阻塞队列。
  • LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
  • LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。

ArrayBlockingQueue是一个用数组实现的有界阻塞队列。此队列按照先进先出(FIFO)的原则对元素进行排序。默认情况下不保证访问者公平的访问队列,所谓公平访问队列是指阻塞的所有生产者线程或消费者线程,当队列可用时,可以按照阻塞的先后顺序访问队列,即先阻塞的生产者线程,可以先往队列里插入元素,先阻塞的消费者线程,可以先从队列里获取元素。

LinkedBlockingQueue是一个用链表实现的有界阻塞队列。此队列的默认和最大长度为Integer.MAX_VALUE。此队列按照先进先出的原则对元素进行排序。

PriorityBlockingQueue是一个支持优先级的无界队列。默认情况下元素采取自然顺序排列,也可以通过比较器comparator来指定元素的排序规则。元素按照升序排列。

DelayQueue是一个支持延时获取元素的无界阻塞队列。队列使用PriorityQueue来实现。队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素。只有在延迟期满时才能从队列中提取元素。

SynchronousQueue是一个不存储元素的阻塞队列。每一个put操作必须等待一个take操作,否则不能继续添加元素。SynchronousQueue可以看成是一个传球手,负责把生产者线程处理的数据直接传递给消费者线程。队列本身并不存储任何元素,非常适合于传递性场景,比如在一个线程中使用的数据,传递给另外一个线程使用,SynchronousQueue的吞吐量高于LinkedBlockingQueue 和 ArrayBlockingQueue。

LinkedTransferQueue是一个由链表结构组成的无界阻塞TransferQueue队列。相对于其他阻塞队列,LinkedTransferQueue多了tryTransfer和transfer方法。

实现原理:

当线程试图向BlockingQueue放入元素时,如果队列已满,则线程被阻塞,当线程试图从中取出一个元素时,如果队列为空,则该线程会被阻塞,

查阅jdk源码:

/**
     * Inserts the specified element at the tail of this queue, waiting
     * for space to become available if the queue is full.
     *
     * @throws InterruptedException {@inheritDoc}
     * @throws NullPointerException {@inheritDoc}
     */
     /**
     插入元素到队列的队尾,如果队列满了则等到有空间才进行插入
     */
    public void put(E e) throws InterruptedException {
        checkNotNull(e);
        final ReentrantLock lock = this.lock;
        lock.lockInterruptibly();
        try {
            while (count == items.length)
                notFull.await();
            insert(e);
        } finally {
            lock.unlock();
        }
    }
/**
如果队列不存在元素,则线程阻塞直到有元素
才能进行take操作
*/
 public E take() throws InterruptedException {
        final ReentrantLock lock = this.lock;
        lock.lockInterruptibly();
        try {
            while (count == 0)
                notEmpty.await();
            return extract();
        } finally {
            lock.unlock();
        }
    }
    ```
    
以下为典型的生产者消费者模式的应用:
```Java
public class BlockingQueue_Test {
	//设定食物容量为5,超过5就必须由消费者进行消费
	private BlockingQueue<Object> food_capacity = new ArrayBlockingQueue<>(5);
	
	public void produce_food (Object food) {
		try {
			food_capacity.put(food);
			System.out.println("生产食物");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public void consume_food (Object food) {
		try {
			food_capacity.take();
			System.out.println("消费食物");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/*
	 * 生产线程
	 */
	static class producer extends Thread {
		private BlockingQueue_Test blo;
		Object food = new Object();
		public producer(BlockingQueue_Test blo) {
			this.blo=blo;
		}
		@Override
		public void run() {
			blo.produce_food(food);
		}
	}
	/*
	 * 消费者线程
	 */
	static class consume extends Thread {
		private BlockingQueue_Test blo;
		Object food = new Object();
		public consume(BlockingQueue_Test blo) {
			this.blo=blo;
		}
		@Override
		public void run() {
			blo.consume_food(food);
		}
	}
	
	public static void main(String[] args) {
			BlockingQueue_Test blockingQueue_Test = new BlockingQueue_Test();
			for(int i=0;i<10;i++) {
				new Thread(new producer(blockingQueue_Test)).start();
			}
			for(int j=0;j<10;j++) {
				new Thread(new consume(blockingQueue_Test)).start();
			}
	}

}

输出:

生产食物
生产食物
生产食物
生产食物
生产食物
生产食物
消费食物
消费食物
生产食物
消费食物
消费食物
消费食物
消费食物
消费食物
生产食物
生产食物
生产食物
消费食物
消费食物
消费食物
Java进阶:BlockingQueue阻塞队列的使用 文章目录1. 概述2. 常用的阻塞队列3. 操作方法3.1 抛出异常3.2 特殊值3.3 阻塞3.4 超时 1. 概述 相比平时讨论的队列,阻塞队列增加了阻塞的功能: 当有限长度的队列填满了数据时,继续往队列添加数据的线程将被阻塞住,持续等待,直到超时或队列数据被消费而腾出空间 当队列数据为空时,消费线程会因为取不到数据而被阻塞,直到生产线程往队列添加数据,此时成功取到数据而不再阻塞 2. 常用的阻塞队列 ArrayBlockingQueue:由数组结构组成的有界阻塞队列 LinkedBlocking 阅读详情

相关推荐

CXL技术入门:从PCIe到高性能计算的桥梁(附最新2.0协议解析)

本文深入解析CXL技术如何作为PCIe的进化版,成为高性能计算的关键桥梁,特别聚焦CXL 2.0协议的关键升级。从技术架构、三大子协议到典型应用场景,全面介绍CXL在缓存一致性、内存共享等方面的优势,帮助开发者快速掌握这一前沿技术。

wdx012345的博客 729

Java并发控制:深入解析Java BlockingQueue的用法与实践

BlockingQueue是一个支持两个附加操作的Queue,即在队列为空时获取元素的线程会等待队列变为非空,当队列满时存储元素的线程会等待队列可用。这主要用于生产者-消费者场景,其中生产者不能添加对象到队列中间,直到有可用空间,反之消费者也不能从队列中获取对象,直到有对象可用。

逆流的小鱼 1106

实战指南:利用 LangGraph 的状态管理实现多轮对话的上下文隔离与持久化

本文详细介绍了如何利用LangGraph的状态管理机制,高效实现多轮对话中的上下文隔离与持久化。通过实战代码演示,从基础的消息历史管理到自定义状态扩展,再到使用SQLite进行生产级持久化,系统讲解了如何借助LangGraph的State和Checkpointer自动化处理对话记忆、用户隔离及数据存储,显著提升开发效率。

weixin_28396629的博客 490

BlockingQueue理论普

BlockingQueue 简介: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。 认识BlockingQueue 阻塞队列,顾名思义,首先它是一个队列。 常用的队列主要有以下两种:(当然通过不同的实现方式,还可以延伸出很多不同类型的队列,DelayQueue就是其中

修复bug生成bug 413

ENVI_基于无人机数据的果树提取与相对健康监测

一、数据处理 1.计算植被指数VDVI或GDVI:Band Math / Spectral Indices 2.制作掩膜:ROI——Threshold——Subset 二、单地块果树提取 1.绘制感兴趣区shp 2.确定果树提取参数:Count Crops 3.输出果树矢量文件:Convert Crops To Shapefile 4.果树相对健康程度分析:Calculate Crop Me...

提供技术服务、资源分享 429690771 1400

【unity游戏开发之InputSystem——01】通过写代码监听InputSystem输入(基于unity6开发介绍)

通过写代码监听InputSystem输入(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4893

java blockqueue_java blockingQueue 原理

blockingQueue 阻塞队列,一般用于消费者生产者模式。 就是通过ReentrantLock和condition实现的阻塞,1 /**Main lock guarding all access*/2 finalReentrantLock lock;3 /**Condition for waiting takes*/4 private finalConditi...

weixin_32350433的博客 393

AI Agent 架构的底层原理与核心机制

AI Agent五层架构实现智能闭环运转:1)感知层负责多模态信息输入与预处理;2)记忆层分类存储短期/长期记忆及知识库;3)认知层通过ReAct推理和反思机制进行决策规划;4)工具层调用外部API扩展能力边界;5)执行层完成任务输出并形成反馈闭环。五层架构通过"输入-处理-输出-优化"的联动机制,使Agent具备自主决策、持续学习和任务执行能力,突破传统LLM的局限,实现从信息处理到实际落地的完整智能体系。

女王の专属领地 501

阻塞队列(BlockingQueue)

阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 下图中展示了线程1往阻塞队列中添加元素,而线程2从阻塞队列中移除元素: 使用不同的队列可以实现不一样的任务存取策略。在这里,我们可以再介绍下阻塞队列的成员:

小泽 368

YOLOv11【第二章:核心模块进阶篇·第3节】LDConv线性可变形卷积改进YOLOv11!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 7442

学习STM32的DS18B20温度传感器

该函数首先复位传感器,然后发送跳过ROM命令和转换命令,并等待转换完成。接下来,它再次复位传感器,发送跳过ROM命令和读取温度命令。最后,它读取温度值的最低字节和最高字节,并将其组合成16位温度值。传感器的VCC引脚连接到STM32的3.3V电源,GND引脚连接到GND,而数据引脚连接到任何一个IO引脚。需要注意的是,示例代码中使用了一个简单的延时函数来等待转换完成。实际上,您可能需要使用定时器或其他更精确的延时方法来实现更准确的延时。下面是一个示例代码,演示如何读取DS18B20传感器的温度值。

m0_75244442的博客 1182

并发队列

并发队列 1.ArrayDeque, (数组双端队列)  2.PriorityQueue, (优先级队列)  3.ConcurrentLinkedQueue, (基于链表的并发队列)  4.DelayQueue, (延期阻塞队列)(阻塞队列实现了BlockingQueue接口)  5.ArrayBlockingQueue, (基于数组的并发阻塞队列)  6.LinkedBlockingQueue...

lyj2018gyq的博客 274

【系统分析师】2009年真题:综合知识-答案及详解

在某银行业务的用例模型中,“取款”用例需要等到“存款”用例执行之后才能执行,两个用例之间的关系属于(1);“取款”和“存款”两个用例中都需 要执行查询余额的功能,将查询余额提取成独立的用例,那么“取款”和“存款” 用例与“查询余额”用例之间的关系属于(2)。(1)A. 关联关系 B. 扩展关系 C. 使用关系 D. 依赖关系 (2)A. 扩展关系 B. 使用关系 C. 依赖关系 D. 继承关系【参考答案】D、A雇员类含有计算报酬的行为,利用面向对象的(3),可以使得其派生类专职 雇员类和兼职雇员类计算报酬的

数据知道的博客 1万+

Java阻塞队列poll_Java高并发,阻塞队列BlockingQueue

BlockingQueue简介BlockingQueue:不是新的东西,父接口java.util.Queue当队列为空时,从队列中获取元素将阻塞。当队列为满时,从队列中添加元素将阻塞。因为是队列,所以我们理应想到先进先出。BlockingQueue常用APIboolean将指定的元素插入到此队列中,如果可以立即执行此操作而不违反容量限制, true在成功后返回 IllegalStateExcept...

weixin_33309048的博客 1731

android 蓝牙通讯demo

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java 阻塞队列--BlockingQueue

1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 阻塞队列提供了四种处理方法: 方法\处理方式 抛出异常 返回特殊值

Firstlucky77的博客 9856

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java 阻塞队列BlockingQueue接口

对于阻塞队列BlockingQueue的学习,予以记录!BlockingQueue接口类似于list接口,①阻塞队列有没有好的一面?②不得不阻塞,如何管理?类似ArrayList用法。

qq_43357394的博客 246

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java阻塞队列作用_BlockingQueue(阻塞队列)详解

注意:该随笔内容完全引自http://wsmajunfeng.iteye.com/blog/1629354,写的很好,非常感谢,复制过来算是个积累,怕以后找不到。一. 前言在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQ...

weixin_36288711的博客 791

Java并发编程-BlockingQueue阻塞队列

1.BlockingQueue介绍 1.1.引言: 阻塞虽然是不好的,但是我们有时候不得不阻塞,比如说一家餐厅人满了,店主当然不希望即将过来的这些客人全部都走,而是希望它们留下来继续排队等候。对于阻塞的内容,线程和资源的调度管理能力,这样就出了一个接口,就叫阻塞队列。在不得不阻塞,必须要阻塞的时候,如何管理好被阻塞的资源和线程,这就是阻塞队列。 队列的特性:先进先出,插入元素在队尾,删除元素在队头。 1.2.阻塞队列介绍: 阻塞:必须要阻塞/不得不阻塞 阻塞队列是一个队列,在数据结构中中起的作用如下图:

Java硬件工程师的博客 4199

java 阻塞队列BlockingQueue

在学习线程池创建的过程中使用到了LinkedBlockingQueue、ArrayBlockingQueue,阻塞队列,比较好奇网上了解一下,做此笔记加深印象 一、阻塞队列 BlockingQueue即阻塞队列,它是基于ReentrantLock,依据它的基本原理,我们可以实现Web中的长连接聊天功能,当然其最常用的还是用于实现生产者与消费者模式,大致如下图所示: 在Java中,BlockingQueue是一个接口,它的实现类有ArrayBlockingQueue、DelayQueue、 Link

qq_37570710的博客 305

java基础之浅聊阻塞队列BlockingQueue

本篇主要聊了一下阻塞队列,以及常用的子类,ArrayBlockingQueue ,LinkedBlockingQueue 等以及其常用的核心方法。

u011863822的博客 535

Java并发多线程编程——阻塞队列(BlockingQueue)

目录一、阻塞队列(BlockingQueue)的概述二、阻塞队列(BlockingQueue)的优点三、阻塞队列(BlockingQueue)的架构介绍四、阻塞队列(BlockingQueue)的分类五、阻塞队列(BlockingQueue)的核心方法5.1、阻塞队列的核心方法图解5.2、阻塞队列的核心方法(抛出异常示例)5.2.1 、代码示例15.2.2 、代码示例25.2.3 、代码示例35.2.4 、代码示例45.2.5 、代码示例55.3、阻塞队列的核心方法(特殊值示例)5.3.1 、代码示例15.

小志的博客 2381

Java并发编程-阻塞队列(BlockingQueue)的实现原理

阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。并发包下很多高级同步类的实现都是基于BlockingQueue实现的。 BlockingQueue 的操作方法

记忆力不好的博客 7万+

阻塞队列 java 例子_java 中 阻塞队列BlockingQueue详解及实例

java 中 阻塞队列BlockingQueue详解及实例BlockingQueue很好的解决了多线程中数据的传输,首先BlockingQueue是一个接口,它大致有四个实现类,这是一个很特殊的队列,如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同样,如果BlockingQueue是满的,任何试图往...

weixin_36488616的博客 409

【Java多线程】阻塞队列(BlockingQueue接口)

1 阻塞队列的好处 定义:阻塞队列首先是一个队列。当阻塞队列为空时,从队列中获取元素的操作将会被阻塞;当阻塞队列为满时,往队列里添加元素的操作将会被阻塞。 阻塞:在多线程领域,阻塞就是在某些情况下会挂起线程;一旦条件满足,被挂起的线程又会自动被唤醒。 BlockingQueue:使用的好处是不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,都交给它去处理,不需要手动管理。 2 不得不阻塞,如何管理 2.1 ArrayBlockingQueue 由数组结构组成的有界阻塞队列。 2.2 Link

Awt_FuDongLai的博客 624

java线程(7)——阻塞队列BlockingQueue

回顾: 阻塞队列,英文名叫BlockingQueue。首先他是一种队列,联系之前Java基础——集合中介绍的Queue与Collection,我们就很容易开始今天的阻塞队列的学习了。来看一下他们的接口定义: Queue: (方法很简单,就不一一注释解释其作用了。) public interface Queue extends Collection { boolean

技术交流 894

【Java并发编程 队列】26.BlockingQueue 阻塞队列

阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是: 在队列为空时,获取元素的线程会等待队列变为非空。 当队列满时,存储元素的线程会等待队列可用。 阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容 器,而消费者也只从容器里拿元素。BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种:ArrayBlockingQue

terrybg 1万+
上一篇: Java的ThreadLoacl类
下一篇: Java之Socket
Coder_py
博客等级 码龄10年 106粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值