美文网首页
LinkedBlockQueue

LinkedBlockQueue

作者: 爱吃豆腐面 | 来源:发表于2021-05-19 00:35 被阅读0次

是什么

LinkedBloakQueue是一个基于单向链表的无界阻塞队列。
在实例化时,如果传入了capacity,那么它就是一个有界的,最大容量即为capacity

Android中的使用

    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

为什么提供三个存、取方法

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

相关文章

  • Guarded Suspension

    定义 守护 LinkedBlockQueue

  • LinkedBlockQueue

    是什么 LinkedBloakQueue是一个基于单向链表的无界阻塞队列。在实例化时,如果传入了capacity,...

  • LinkedBlockQueue和LinkedBlockDequ

    动机起源:来自于有人问这两个堵塞队列哪个效率高一点。先说答案:LinkedBlockQueue高一点。而且,这两个...

  • Android_AsyncTask源码解析

    实现原理: 线程池+Handler 用到的数据结构:LinkedBlockQueue, 这说明AsyncTask是...

网友评论

      本文标题:LinkedBlockQueue

      本文链接:https://www.haomeiwen.com/subject/tbkywhtx.html