`
fang4084
  • 浏览: 1152 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

(转)几种阻塞队列

    博客分类:
阅读更多
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的值被取走。
[/size]
分享到:
评论

相关推荐

    对几种队列的总结

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

    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`是无界的优先级队列,它们各自的特点和适用...

    用C语言实现(块)队列

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

    tp5.1消息队列 think-queue

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

    Android中的线程池与任务队列

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

    workquere工作队列 多线程

    工作队列(Work Queue)是一种在多线程编程中广泛使用的模式,用于协调并发任务的执行,优化系统资源的利用并提高程序的响应速度。在C#中,工作队列通常用于将耗时的任务放入队列,然后由一组后台线程来处理这些任务...

    rt-thread队列代码详解

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

    多级反馈队列调度算法

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

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

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

    Thinkphp6实现队列代码

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

    操作系统课程设计报告-多级反馈队列调度算法模拟

    在进行多级反馈队列调度算法的模拟时,我们需要考虑以下几个关键点: 1. **进程模型**:定义进程的生命周期,包括创建、运行、等待、阻塞和终止等状态。 2. **队列管理**:实现多级队列的数据结构,能够快速地插入...

    测试消息队列容量(Delphi版)

    在IT领域,消息队列是一种重要的并发控制和通信机制,尤其在多线程编程和分布式系统中广泛应用。本文将深入探讨Delphi环境下的消息队列,以及如何通过Delphi7来测试Windows线程内消息队列的最大容量。 首先,我们要...

    基于STM32的FreeRTOS串口队列通信

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

    5.7 环形队列的代码实现.rar

    环形队列的代码实现通常包括以下几个关键部分: 1. **初始化**:在创建环形队列时,需要指定数组大小并初始化头尾指针。头指针表示队列中最早加入但未被处理的元素,尾指针表示下一次插入元素的位置。初始时,头尾...

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

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

    无锁队列

    无锁队列是一种高效、线程安全的数据结构,它在多线程环境下广泛应用于高性能并发编程,例如在Java中,著名的Disruptor框架就利用了无锁队列的设计。无锁队列的核心思想是利用原子操作(如CAS,Compare and Swap)来...

    fifo队列设计

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

Global site tag (gtag.js) - Google Analytics