是什么
LinkedBloakQueue是一个基于单向链表的无界阻塞队列。
在实例化时,如果传入了capacity
,那么它就是一个有界的,最大容量即为capacity
Android中的使用
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue());
}
为什么提供三个存、取方法
存
offer:容量已满时,直接返回false
add:内部调用offer,容量已满时,抛IllegalStateException异常
put:容量已满时,调用put的线程等待notFull.await(),是阻塞方法
取
poll:容量为空时,直接返回null
remove:内部调用poll,容量为空时,抛NoSuchElementException异常
take:容量为空时,调用take的线程等待notEmpty.await(),是阻塞方法
LinkedBlockQueue如何实现生产者消费者的
/** Lock held by take, poll, etc */
//take, poll获取takeLock的线程才可以进入同步代码块
private final ReentrantLock takeLock = new ReentrantLock();
/** Wait queue for waiting takes */
//takeLock同步代码块内,队列为空时notEmpty.await(),让调用线程等待; 获取成功后,证明队列不满,则signalNotFull()
private final Condition notEmpty = takeLock.newCondition();
/** Lock held by put, offer, etc */
//put, offer时只有获取putLock的线程才可以进入同步代码块
private final ReentrantLock putLock = new ReentrantLock();
/** Wait queue for waiting puts */
//putLock同步代码块中,队列已满时,notFull.await(),让调用线程等待; 添加成功后,证明队列不空,则signalNotEmpty()
private final Condition notFull = putLock.newCondition();
特别方法
poll(long ,TimeUnit):带超时时间的poll方法(notEmpty.awaitNanos(nanos))
offer(long,TimeUnit):带超时时间的offer方法(notFull.awaitNanos(nanos))
peek():获取队列中的第一个元素,不改变队列大小