Queue是JDK 5以后引入的新的集合类,它属于Java Collections Framework的成员,在Collection集合中和List/Set是同一级别的接口。通常来讲Queue描述的是一种FIFO的队列,当然不全都是,比如PriorityQueue是按照优先级的顺序(或者说是自然顺序,借助于Comparator接口)。
下图描述了Java Collections Framework中Queue的整个家族体系。
对于Queue而言是在Collection的基础上增加了offer/remove/poll/element/peek方法,另外重新定义了add方法。对于这六个方法,有不同的定义。
抛出异常 |
返回特殊值 |
操作描述 |
|
插入 |
add(e) |
offer(e) |
将元素加入到队列尾部 |
移除 |
remove() |
poll() |
移除队列头部的元素 |
检查 |
element() |
peek() |
返回队列头部的元素而不移除此元素 |
特别说明的是对于Queue而言,规范并没有规定是线程安全的,为了解决这个问题,引入了可阻塞的队列BlockingQueue。对于BlockingQueue而言所有操作的是线程安全的,并且队列的操作可以被阻塞,直到满足某种条件。Queue的另一个子接口Deque描述的是一个双向的队列。与Queue不同的是,Deque允许在队列的头部增加元素和在队列的尾部删除元素。也就是说Deque是一个双向队列。二者功能都有的队列就是BlockingDeque,这种阻塞队列允许在队列的头和尾部分别操作元素,应该说是Queue中功能最强大的实现。
在JDK 5之前LinkedList就已经存在,而且本身实现都是一种双向队列。所以到了JDK 5以后就将LinkedList同时实现Deque接口,这样LinkedList就又属于Queue的一部分了。
通常情况下Queue都是靠链表结构实现的,但是链表意味着有一些而外的引用开销,如果是双向链表开销就更大了。所以为了节省内存,一种方式就是使用固定大小的数组来实现队列。在这种情况下队列的大小是固定,元素的遍历通过数组的索引进行,很显然这是一种双向链表的模型。ArrayDeque就是这样一种实现。
另外ArrayBlockingQueue也是一种数组实现的队列,但是却没有改造成双向,仅仅实现了BlockingQueue的模型。理论上和ArrayDeque一样也应该容易改造成双向的实现。
PriorityQueue和PriorityBlockingQueue实现了一种排序的队列模型。这很类似与SortedSet,通过队列的Comparator接口或者Comparable元素来排序元素。这种情况下元素在队列中的出入就不是按照FIFO的形式,而是根据比较后的自然顺序来进行。
CocurrentLinkedQueue是一种线程安全却非阻塞的FIFO队列,这种队列通常实现起来比较简单,但是却很有效。在接下来的章节会详细的描述它。
SynchronousQueue是一种特别的BlockingQueue,它只是把一个add/offer操作的元素直接移交给remove/take操作。也就是说它本身不会缓存任何元素,所以严格意义上说来讲并不是一种真正的队列。此队列维护一个线程列表,这些线程等待从队列中加入元素或者移除元素。简单的说,至少有一个remove/take操作时add/offer操作才能成功,同样至少有一个add/offer操作时remove/take操作才能成功。这是一种双向等待的队列模型,出队列等待加入等列,而入队列又等待出队列。这种队列的好处在于能够最大线程的保持吞吐量却又是线程安全的。所以对于一个需要快速处理的任务队列,SynchronousQueue是一个不错的选择。
BlockingQueue还有一种实现DelayQueue,这种实现允许每一个元素(Delayed)带有一个延时时间,当调用take/poll的时候会检测队列头元素这个时间是否<=0,如果满足就是说已经超时了,那么此元素就可以被移除了,否则就会等待。特别说明的是这个头元素应该是最先被超时的元素(这个时间是绝对时间)。这个类设计很巧妙,被用于ScheduledFutureTask来进行定时操作。希望后面会开辟一个章节讲讲这里面的想法。实在不行在讲线程池部分肯定会提到这个。
相关推荐
在本文中,我们将深入探讨如何使用C#中的队列数据结构(Queue)来解决简单的并发问题。队列是一种线性数据结构,遵循先进先出(FIFO)的原则,即第一个进入的元素也将是第一个离开的元素。这种特性使得队列在处理...
标题中的“cpp-一个快速多生产者多消费者的C11无锁并发队列”指的是一个用C++11标准编写的高效并发数据结构,特别设计用于支持多个生产者线程和多个消费者线程同时访问的无锁并发队列。这种队列在多线程环境中非常...
总结,"tp5.1消息队列 think-queue" 是一种在ThinkPHP5.1环境中实现消息队列的方式,通过使用think-queue组件,开发者可以轻松地创建和管理异步任务,提高应用的并发处理能力和系统稳定性。理解其安装、配置、使用...
在C#编程中,队列(Queue)...总结来说,这个实例展示了如何在C#中使用队列Queue进行多线程编程,包括创建队列、入队、出队以及创建和启动线程。理解这些基本概念和操作对于开发涉及多线程和队列的C#应用程序至关重要。
concurrentqueue, 一种快速多消费者多消费者锁空闲并发队列 moodycamel::ConcurrentQueue面向 C 的工业强度锁自由队列。注意:如果你只需要一个生产者,单个消费者队列,我有其中的一个太多。特性Knock-your-socks-...
设计并发队列 代码如下:#include <pthread>#include <list>using namespace std; template <typename>class Queue { public: Queue( ) { pthread_mutex_init(&_lock, NULL); } ~Queue( ) { pthread_mutex_destroy(&...
通过阅读和分析这段代码,你可以深入理解C语言如何与Unix/Linux线程库结合,实现高效、安全的队列数据结构。这不仅有助于提升C语言编程技巧,还能增强对线程编程的理解,为后续更复杂的系统级编程打下坚实基础。
fast-wait-free-queue, 并发队列实现的基准框架 快速等待空闲队列这是评估并发队列性能的基准测试框架。 目前,它包含4 个并发队列。 它们是:一个快速等待队列 wfqueueafek的Morrison和 lcrqkallimanis的Fatourou和...
在Java编程语言中,`Queue`接口是集合框架的一部分,它代表了先进先出(FIFO)的数据结构,也就是我们通常所说的队列。队列是一种非常基础且实用的数据结构,广泛应用于多线程同步、任务调度、缓存管理等多个场景。...
并发队列有不同优先级,包括`DISPATCH_QUEUE_PRIORITY_HIGH`、`DISPATCH_QUEUE_PRIORITY_DEFAULT`和`DISPATCH_QUEUE_PRIORITY_LOW`,以及`DISPATCH_QUEUE_PRIORITY_BACKGROUND`。高优先级队列的任务会优先执行。 9...
1. **创建并发队列**:你可以通过`dispatch_queue_create()`函数创建自定义并发队列,或者使用全局并发队列。全局队列是系统提供的,已经预设为并发执行,可以直接使用。 2. **提交任务**:使用`dispatch_async()`...
Python中的`queue`模块提供了多种类型的队列,包括`Queue`(默认限制大小)、`LifoQueue`(后进先出,类似堆栈)和`PriorityQueue`(优先级队列)。这些队列都实现了线程安全的`put()`和`get()`方法,用于添加和获取...
基于承诺的并发性受限的工作人员队列。 用法 // Create a queue with two worker threads const queue = new Queue ( 2 ) ; queue . onEmpty ( ( ) => { console . log ( 'done' ) ; } ) ; // Adding tasks to do ...
在C++编程中,消息队列(Message Queue)是一种常用的数据结构,用于在并发环境或者不同线程之间...通过学习“c++消息队列queue.rar”中的内容,开发者能够更好地掌握如何在C++中有效地利用消息队列实现高效并发编程。
2. **LIFO(Last-In-First-Out)队列**:类似于堆,通过`queue.LifoQueue(maxsize)`创建,先进后出,与栈的行为类似,最后放入队列的元素最先被处理。 3. **优先级队列(Priority Queue)**:通过`queue....
并发编程之Operation Queue和GCD Operation Queue是一个面向对象的并发编程接口,它支持并发数、线程优先级、任务优先级、任务依赖关系等多种配置,可以方便满足各种复杂的多任务处理场景。 GCD(Grand Central ...
在.NET框架中,`ConcurrentQueue<T>`是一个线程安全的队列数据结构,它被设计用于多线程环境下的高效并发操作。这个类是System.Collections.Concurrent命名空间的一部分,提供了在多个线程读写数据时的安全性和性能...
### 线程安全队列Queue #### 一、背景介绍 在开发多线程应用时,线程安全成为至关重要的考量因素之一。特别是在需要处理并发任务时,如何确保线程之间的安全通信变得尤为重要。本篇文章将围绕一个具体的场景——...
8. **队列与栈的区别**:栈是后进先出(LIFO)的数据结构,而队列是先进先出。理解这两种数据结构的区别有助于选择合适的数据结构来解决具体问题。 通过学习本教程,开发者不仅能掌握Java中队列的基本使用,还能...