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
: 内部没有容量,可以作为线程间的即时消息传递机制。