java中Queue简介

Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构java

offer,add区别:
一些队列有大小限制,所以若是想在一个满的队列中加入一个新项,多出的项就会被拒绝。
这时新的 offer 方法就能够起做用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是获得由 offer() 返回的 false。数组

poll,remove区别:
remove() 和 poll() 方法都是从队列中删除第一个元素(head)。remove() 的行为与 Collection 接口的版本类似,
可是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。所以新的方法更适合容易出现异常条件的状况。安全

peek,element区别:
element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法相似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。数据结构

Tiger中有2组Queue的实现:实现了新的BlockingQueue接口的和没有实现的
1)没有实现的阻塞接口的LinkedList: 实现了java.util.Queue接口和java.util.AbstractQueue接口
内置的不阻塞队列: PriorityQueue 和 ConcurrentLinkedQueue
PriorityQueue 和 ConcurrentLinkedQueue 类在 Collection Framework 中加入两个具体集合实现。 
PriorityQueue 类实质上维护了一个有序列表。加入到 Queue 中的元素根据它们的自然排序(经过其 java.util.Comparable 实现)或者根据传递给构造函数的 java.util.Comparator 实现来定位。
ConcurrentLinkedQueue 是基于连接节点的、线程安全的队列。并发访问不须要同步。由于它在队列的尾部添加元素并从头部删除它们,因此只要不须要知道队列的大 小,ConcurrentLinkedQueue 对公共集合的共享访问就能够工做得很好。收集关于队列大小的信息会很慢,须要遍历队列。
2)实现阻塞接口的:
新 的 java.util.concurrent 包在 Collection Framework 中可用的具体集合类中加入了 BlockingQueue 接口和五个阻塞队列类。它实质上就是一种带有一点扭曲的 FIFO 数据结构。不是当即从队列中添加或者删除元素,线程执行操做阻塞,直到有空间或者元素可用。
五个队列所提供的各有不一样:
* ArrayBlockingQueue :一个由数组支持的有界队列。
* LinkedBlockingQueue :一个由连接节点支持的可选有界队列。
* PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。
* DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
* SynchronousQueue :一个利用 BlockingQueue 接口的简单汇集(rendezvous)机制。
前 两个类 ArrayBlockingQueue 和 LinkedBlockingQueue 几乎相同,只是在后备存储器方面有所不一样, LinkedBlockingQueue 并不老是有容量界限。无大小界限的 LinkedBlockingQueue 类在添加元素时永远不会有阻塞队列的等待(至少在其中有Integer.MAX_VALUE 元素以前不会)。
PriorityBlockingQueue 是具备无界限容量的队列,它利用所包含元素的 Comparable 排序顺序来以逻辑顺序维护元素。能够将它看做 TreeSet 的可能替代物。不过对 PriorityBlockingQueue 有一个技巧。从 iterator() 返回的 Iterator 实例不须要以优先级顺序返回元素。若是必须以优先级顺序遍历全部元素,那么让它们都经过 toArray() 方法并本身对它们排序,像 Arrays.sort(pq.toArray())。
新的 DelayQueue 实现多是其中最有意思(也是最复杂)的一个。加入到队列中的元素必须实现新的 Delayed 接口(只有一个方法 —— long getDelay(java.util.concurrent.TimeUnit unit) )。由于队列的大小没有界限,使得添加能够当即返回,可是在延迟时间过去以前不能从队列中取出元素。若是多个元素完成了延迟,那么最先失效/失效时间最长 的元素将第一个取出。实际上没有听上去这样复杂。
SynchronousQueue 类是最简单的。它没有内部容量。它就像线程之间的手递手机制。在队列中加入一个元素的生产者会等待另外一个线程的消费者。当这个消费者出现时,这个元素就直接在消费者和生产者之间传递,永远不会加入到阻塞队列中。并发

相关文章
相关标签/搜索