LinkedBlockQueue

是什么

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():获取队列中的第一个元素,不改变队列大小

你可能感兴趣的:(LinkedBlockQueue)