队列的有界无界:
有界:当线程数大于队列线程数时,若在指定延迟时间后返回为false,则阻塞线程。
无界:队列无线程数限制,若资源过多直至CPU资源耗尽
他们都是阻塞队列,都继承自BlockingQueue接口
ArrayBlockingQueue:数组式有界阻塞队列:其内部维护了一个数组,实现有:
来自:java api
ArrayBlockingQueue(int capacity)
创建指定大小有界队列
|
ArrayBlockingQueue(int capacity, boolean fair)
创建指定大小,指定锁策略是否为公平锁
|
|
ArrayBlockingQueue提供了如下使用方法:
来自 java api
boolean | add(E e)
添加到队列尾部,若队列满则抛出异常 队列满,阻塞队列
|
void | clear()
原子性的删除队列所有元素
|
boolean | contains(Object o)
如果队列存在指定元素,返回true
|
int | drainTo(Collection<? super E> c)
删除队列所有元素,并添加到给定的集合
|
int | drainTo(Collection<? super E> c, int maxElements)
删除给定大小的元素到给定的集合
|
Iterator<E> | iterator()
迭代队列中的元素
|
boolean | offer(E e)
若队列未满则添加到队列尾部,否则返回false,不阻塞与add不同offer不抛出异常 queue full
|
boolean | offer(E e, long timeout, TimeUnit unit)
若队列满则等待给定时间,若超时队列任然满则返回false。
|
E | peek()
检索队列,但不删除队列 首元素,若为null 则返回空
|
E | poll()
检索并删除队列首元素,若为null则返回空
|
E | poll(long timeout, TimeUnit unit)
等待指定时间检索删除队列首元素
|
void | put(E e)
在队列尾部插入元素,若队列满则阻塞等待
|
int | remainingCapacity()
返回队列最大值(可存储元素的限制数)
|
boolean | remove(Object o)
从队列中删除给定元素,若存在的话
|
int | size()
返回队列元素大小
|
E | take()
若队列不为空,则获取队列首元素并删除。若队列为空则阻塞等待
|
Object[] | toArray()
顺序返回该队列中的元素为数组
|
<T> T[] | toArray(T[] a)
返回指定数组类型元素 数组
|
String | toString()
返回字符串形式
|
部分演示:
LinkedBlockingQueue:内部由链表实现的阻塞队列,实现有:
来自 java api
LinkedBlockingQueue()
创建一个具有默认最大容量的队列 Integer.MAX_VALUE .
|
LinkedBlockingQueue(Collection<? extends E> c)
创建一个给定初始化集合默认最大容量 Integer.MAX_VALUE , 的阻塞队列
|
LinkedBlockingQueue(int capacity)
创建一个给定大小的队列
|
方法同ArrayBlockingQueue一致。
区别:
ArrayBlockingQueue:其 读 写锁未分离。LinkedBlockingQueue实现了读 写锁分离(putLock,takeLock)