BlockingQueue 简单学习

队列的有界无界:

有界:当线程数大于队列线程数时,若在指定延迟时间后返回为false,则阻塞线程。

无界:队列无线程数限制,若资源过多直至CPU资源耗尽

他们都是阻塞队列,都继承自BlockingQueue接口

     

   ArrayBlockingQueue:数组式有界阻塞队列:其内部维护了一个数组,实现有:

来自:java api         

ArrayBlockingQueue(int capacity)
创建指定大小有界队列
ArrayBlockingQueue(int capacity, boolean fair)
创建指定大小,指定锁策略是否为公平锁

ArrayBlockingQueue(int capacity, boolean fair, Collection<? extends E> c)

创建一个指定大小,指定锁策略,指定初始化集合的有界队列

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)




猜你喜欢

转载自blog.csdn.net/qq_28834183/article/details/80447366
今日推荐