一个集合被设计成持有处理优先级的元素集合。
除了基本的Collection集合操作外,还提供额外的 插入、提取和检查操作
这些操作的每一种都存在两种形式:
1、如果操作失败 会抛异常
Insert
{@link Queue#add add(e)}
Remove
{@link Queue#remove remove()}
Examine
{@link Queue#element element()}
2、返回一个特殊值 null或者false 依赖于操作
后一种插入操作专门用于容量限制的Queue。
在大多数实现中,插入操作不能失败。
Insert
{@link Queue#offer offer(e)}
Remove
{@link Queue#poll poll()}
{@link Queue#peek peek()}
插入操作的另一种形式专门和容量限制 Queueue,在大多数实现中,插入操作不能失败
典型的队列,但不一定是,在A中的顺序元素FIFO(先进先出)方式。
例外情况是优先级队列,它根据提供的元素排序比较器,或元素的自然排序,以及LIFO队列(或堆栈顺序元素LIFO(后进先出)。
无论使用的顺序是什么,队列的head 在调用remove poll 的时候移除
在FIFO 队列中 所有新增元素加在队列尾部,Queue每种实现必须制定它的顺序属性
offer 尽可能插入元素 否则返回 false
不同于Collection add 加入元素失败 仅仅通过抛出unchecked exception
当失败是一种常态 offer 被设计来使用
而不是发生异常
例如 一个固定大小或者边界的队列
remove
poll
方法 移除和返回队列的头部
准确的说 哪个元素从队列中移除 是一个队列排序策略的函数
不同于实现
remove 和 poll 方法仅仅在他们行为上的不同
当队列是空的
remove 方法抛出异常
poll 方法返回null
element()和peek() 方法返回 但不移除 队列头部
接口不定义blocking queue方法 在并发编程中
这些方法 等待元素去出现或者空间去变成可用
定义在blockingQueue 接口
Queue 不允许插入空值
尽管一些实现如linkedlist 允许插入空值
空值不应该插入到队列中
null是可以被用作特殊返回值 通过 poll 表明 队列是空的
Queue没有定义基于元素方法的版本 equals hashcode
但是继承了唯一基础版本来自Object
因为队列没有很好地定义唯一基础相等性 给同样的元素 但是不同的顺序属性
实现类
常用队列
ConcurrentLinkedQueue 是基于链接节点的、线程安全的队列。并发访问不需要同步。因为它在队列的尾部添加元素并从头部删除它们,所以只要不需要知道队列的大 小, ConcurrentLinkedQueue 对公共集合的共享访问就可以工作得很好。收集关于队列大小的信息会很慢,需要遍历队列。
SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。
LinkedBlockingQueue 容量是没有上限的(说的不准确,在不指定时容量为Integer.MAX_VALUE,不要然的话在put时怎么会受阻呢),但是也可以选择指定其最大容量,它是基于链表的队列,此队列按 FIFO(先进先出)排序元素。一个由链接节点支持的可选有界队列。
ArrayBlockingQueue
一个由数组支持的有界队列。 在构造时需要指定容量, 并可以选择是否需要公平性,如果公平参数被设置true,等待时间最长的线程会优先得到处理(其实就是通过将ReentrantLock设置为true来 达到这种公平性的:即等待时间最长的线程会先操作)。通常,公平性会使你在性能上付出代价,只有在的确非常需要的时候再使用它。它是基于数组的阻塞循环队 列,此队列按 FIFO(先进先出)原则对元素进行排序。
PriorityQueue 类实质上维护了一个有序列表。加入到 Queue 中的元素根据它们的天然排序(通过其 java.util.Comparable 实现)或者根据传递给构造函数的 java.util.Comparator 实现来定位。
PriorityBlockingQueue 一个由优先级堆支持的无界优先级队列。 是一个带优先级的 队列,而不是先进先出队列。元素按优先级顺序被移除,该队列也没有上限(看了一下源码,PriorityBlockingQueue是对 PriorityQueue的再次包装,是基于堆数据结构的,而PriorityQueue是没有容量限制的,与ArrayList一样,所以在优先阻塞 队列上put时是不会受阻的。虽然此队列逻辑上是无界的,但是由于资源被耗尽,所以试图执行添加操作可能会导致 OutOfMemoryError),但是如果队列为空,那么取元素的操作take就会阻塞,所以它的检索操作take是受阻的。另外,往入该队列中的元 素要具有比较能力。
是一个带优先级的 队列,而不是先进先出队列。元素按优先级顺序被移除,该队列也没有上限(看了一下源码,PriorityBlockingQueue是对 PriorityQueue的再次包装,是基于堆数据结构的,而PriorityQueue是没有容量限制的,与ArrayList一样,所以在优先阻塞 队列上put时是不会受阻的。虽然此队列逻辑上是无界的,但是由于资源被耗尽,所以试图执行添加操作可能会导致 OutOfMemoryError),但是如果队列为空,那么取元素的操作take就会阻塞,所以它的检索操作take是受阻的。另外,往入该队列中的元 素要具有比较能力。
DelayQueue 一个由优先级堆支持的、基于时间的调度队列。
(基于PriorityQueue来实现的)是一个存放Delayed元素的无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部,并且poll将返回null。当一个元素的 getDelay(TimeUnit.NANOSECONDS)方法返回一个小于或等于零的值时,则出现期满,poll就以移除这个元素了。此队列不允许使用 null 元素。
(基于PriorityQueue来实现的)是一个存放Delayed 元素的无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部,并且poll将返回null。当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于或等于零的值时,则出现期满,poll就以移除这个元素了。此队列不允许使用 null 元素。