`
jjw
  • 浏览: 65637 次
文章分类
社区版块
存档分类
最新评论

几种阻塞队列

阅读更多

BlockingQueue

获取元素的时候等待队列里有元素,否则阻塞
保存元素的时候等待队列里有空间,否则阻塞
用来简化生产者消费者在多线程环境下的开发
ArrayBlockingQueue
FIFO、数组实现
有界阻塞队列,一旦指定了队列的长度,则队列的大小不能被改变
在生产者消费者例子中,如果生产者生产实体放入队列超过了队列的长度,则在offer(或者put,add)的时候会被阻塞,直到队列的实体数量< 队列的初始size为止。不过可以设置超时时间,超时后队列还未空出位置,则offer失败。
如果消费者发现队列里没有可被消费的实体时也会被阻塞,直到有实体被生产出来放入队列位置,不过可以设置等待的超时时间,超过时间后会返回null
DelayQueue
有界阻塞延时队列,当队列里的元素延时期未到是,通过take方法不能获取,会被阻塞,直到有元素延时到期为止
如:
1.obj 5s 延时到期
2.obj 6s 延时到期
3.obj 9s 延时到期
那么在take的时候,需要等待5秒钟才能获取第一个obj,再过1s后可以获取第二个obj,再过3s后可以获得第三个obj
这个队列可以用来处理session过期失效的场景,比如session在创建的时候设置延时到期时间为30分钟,放入延时队列里,然后通过一个线程来获取这个队列元素,只要能被获取到的,表示已经是过期的session,被获取的session可以肯定超过30分钟了,这时对session进行失效。

LinkedBlockingQueue
FIFO、Node链表结构
可以通过构造方法设置capacity来使得阻塞队列是有界的,也可以不设置,则为无解队列
其他功能类似ArrayBlockingQueue


PriorityBlockingQueue
无界限队列,相当于PriorityQueue + BlockingQueue
插入的对象必须是可比较的,或者通过构造方法实现插入对象的比较器Comparator<? super E>
队列里的元素按Comparator<? super E> comparator比较结果排序,PriorityBlockingQueue可以用来处理一些有优先级的事物。比如短信发送优先级队列,队列里已经有某企业的100000条短信,这时候又来了一个100条紧急短信,优先级别比较高,可以通过PriorityBlockingQueue来轻松实现这样的功能。这样这个100条可以被优先发送
SynchronousQueue
无内部容量的阻塞队列,put必须等待take,同样take必须等待put。比较适合两个线程间的数据传递。异步转同步的场景不太适用,因为对于异步线程来说在处理完事务后进行put,但是必须等待put的值被取走。

分享到:
评论

相关推荐

    java模拟阻塞队列

    Java中的阻塞队列实现主要依赖于`java.util.concurrent`包下的几个类,如`BlockingQueue`接口、`ArrayBlockingQueue`、`LinkedBlockingQueue`等。`BlockingQueue`接口定义了一组操作,如`put`、`take`、`offer`等,...

    阻塞队列(Blocking Queue)是一个支持两个附加操作的队列.txt

    在Java中,阻塞队列主要支持以下几种操作: 1. 入队操作(add(e)、offer(e)):将指定元素添加到队列中。若队列已满,offer操作会返回false,而add操作会抛出IllegalStateException。 2. 出队操作(remove()、poll()...

    对几种队列的总结

    本篇文章将对几种常见的队列进行深入的总结和探讨。 首先,我们来看最基本的**线性队列**,也称为顺序队列。线性队列在内存中通常是通过数组实现的,它的入队操作在队尾进行,出队操作在队头进行。当队列满时,可以...

    阻塞队列实现生产者消费者模式Java开发Java经验技巧共

    2. **队列实现**:接着可能会讲解几种具体的阻塞队列实现,比如`ArrayBlockingQueue`是基于数组的有界队列,`LinkedBlockingQueue`基于链表,以及`PriorityBlockingQueue`是无界的优先级队列,它们各自的特点和适用...

    Java并发编程--BlockingQueue.docx

    JDK 提供的几种阻塞队列实现: 1. ArrayBlockingQueue:基于数组的有界阻塞队列,线程安全,遵循先进先出(FIFO)原则,可以通过构造函数设置容量。 2. LinkedBlockingQueue:基于链表的有界阻塞队列,默认无大小...

    Java 阻塞队列详解及简单使用

    Java提供了几种阻塞队列的实现,每种实现都有其特定的特性: - **ArrayBlockingQueue**:基于数组的有界阻塞队列,容量固定,性能高效,适合对容量有严格控制的场景。 - **LinkedBlockingQueue**:基于链表结构的...

    Java中使用阻塞队列控制线程集实例

    这个程序涉及到几个关键的Java并发概念和技术,包括线程、阻塞队列以及并发容器类。 首先,阻塞队列是一种特殊类型的队列,它支持线程间的同步和通信。当队列为空时,尝试从中取元素的线程会被阻塞,直到有新的元素...

    用C语言实现(块)队列

    在IT领域,尤其是在系统编程和嵌入式系统中,队列是一种非常重要的数据结构,它在处理并发操作和数据传输时起着关键作用。本文将详细介绍如何使用C语言实现一个块队列,以及如何通过提供的`queue_dt_init`、`queue_...

    网络游戏-分组网络中表示几种不同阻塞原因的阻塞通知方法及设备.zip

    - **FIFO与WFQ(Weighted Fair Queuing)**:先进先出(FIFO)和加权公平队列(WFQ)是两种常见的数据包调度策略,用于优化数据包处理顺序,减少延迟。 5. **网络游戏应用**:在网络游戏场景中,低延迟和高可靠性...

    tp5.1消息队列 think-queue

    总结,"tp5.1消息队列 think-queue" 是一种在ThinkPHP5.1环境中实现消息队列的方式,通过使用think-queue组件,开发者可以轻松地创建和管理异步任务,提高应用的并发处理能力和系统稳定性。理解其安装、配置、使用...

    rt-thread队列代码详解

    在rt-thread操作系统中,消息队列是一种进程间通信(IPC)机制,允许数据结构在不同任务之间传递。本文将详细解释rt-thread 3.0版本中的消息队列实现。 首先,我们需要理解消息队列的基本概念。在rt-thread中,消息...

    Android中的线程池与任务队列

    Android提供了几种不同的拒绝策略,如丢弃最旧的任务、抛出异常等。 4. 管理器(ThreadPoolExecutor):负责线程池的生命周期管理,如初始化、扩展、收缩以及关闭线程池。 任务队列(Task Queue)是线程池的重要...

    workquere工作队列 多线程

    在"C#实现的工作队列,workquere,多线程管理"项目中,我们可以推断出以下几个关键知识点: 1. **线程池**:C#中的`System.Threading.ThreadPool`类是工作队列的基础,它提供了一组线程,用于执行异步任务。线程池...

    多级反馈队列调度算法

    多级反馈队列调度算法(Multilevel Feedback Queue Scheduling,MLFQ)是一种在操作系统中用于进程调度的策略,其目标是优化系统的整体性能,兼顾各种类型的任务,确保响应时间和吞吐量的平衡。该算法的核心思想是将...

    Thinkphp6实现队列代码

    队列是一种先进先出(FIFO)的数据结构,用于处理大量任务而不阻塞主线程。在Web应用中,队列可以用来解耦即时处理和后台任务,比如邮件发送、数据分析或者长时间运行的数据库操作。ThinkPHP6提供了对队列的支持,...

    无锁队列

    5. 分析和对比无锁队列与其他并发数据结构(如阻塞队列、同步队列)的性能差异。 通过以上的学习,你将能够掌握无锁队列的基本原理和应用场景,提升你的并发编程能力。在《Java并发编程实战》等书籍中,也可以找到...

    线程间同步和通信之消息队列(动态)

    在RT-thread中,消息队列是线程间通信的一种原生机制,它支持阻塞和非阻塞两种操作模式,以及动态分配和静态分配两种创建方式。 在"STM32 RT-thread 消息队列动态"这个主题中,动态消息队列意味着在运行时根据需要...

    基于STM32的FreeRTOS串口队列通信

    1. 队列满处理:使用`xQueueSend()`的非阻塞形式`xQueueSendToBackFromISR()`或`xQueueSendToFrontFromISR()`,当队列已满时,可以设置一个返回状态,表明无法发送数据。 2. 队列空处理:同样,当尝试从空队列接收...

    fifo队列设计

    FIFO队列的操作主要有以下几种: 1. 入队(enqueue):将一个元素添加到队列的尾部。如果队列已满,则需要根据具体实现决定如何处理,例如阻塞等待或者丢弃新元素。 2. 出队(dequeue):移除并返回队列头部的元素...

Global site tag (gtag.js) - Google Analytics