Java Queue分析

Java中Queue的使用

Queue接口与List、Set同一级别,都是继承了Collection接口。

LinkedList实现了Queue接口。Queue接口窄化了对LinkedList的方法的访问权限。

BlockingQueue继承了Queue接口。

在多线程进行合作时,阻塞队列是很有用的工具。

工作者线程可以定期地把中间结果存到阻塞队列中,而其他工作者线程可以把中间结果取出来并在将来修改它们。队列会自动平衡负载。

抛异常 返回特殊值
插入 add(e) offer(e) return false if fail
移除 remove() poll()
检查 element() peek()

Queue一般不能包含null值,但是,某些实现,例如LinkedList不禁止null值的插入。

BlockingQueue的方法:

抛异常 特殊值 阻塞 超时
插入 add(e) offer(e) put(e) offer(e, time, unit)
移除 remove() poll() take() pull(time, unit)
检查 element() peek() —— ——

不能包含null。A null is used as sentinel value to indicate failure of poll operations.

阻塞队列的四个变种

java.util.concurrent包提供了阻塞队列的四个变种。

LinkedBlockingQueue: 默认容量是Integer.MAX_VALUE。基于链表

ArrayBlockingQueue: 构造时,需要指定容量,并可以选择是否需要公平性,内部机制是通过将ReentrantLock设置为true来 达到公平性的。通常,公平性会使你在性能上付出代价。它是基于 数组的 阻塞循环队列。

PriorityBlockingQueue:带优先级的队列,非FIFO。

DelayQueue:基于PriorityQueue来实现。存放Delayed元素的无界阻塞队列。

另有,

SynchronousQueue: 内部没有容量,可以作为线程间的即时消息传递机制。