Java阻塞队列

定义

阻塞队列是一个支持两个附加操作的队列,即:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。

常用方法

处理方式 抛出异常 返回特殊值 一直阻塞 超时退出
插入方法 add(e) offer(e) put(e) offer(e,time,unit)
移除方法 remove() poll() take() poll(time,unit)
检查方法 element() peek() 不可用 不可用

备注:peek() 返回队列头部的元素,如果队列为空,则返回null;element()如果队列为空,则抛出一个NoSuchElementException异常。

JDK提供的7中阻塞队里

ArrayBlockingQueue

基于数组的有界阻塞队列,创建队列的时候必须制定队列的大小,使用一把锁。

LinkedBlockingQueue

基于链表的有界阻塞队列,创建队列的时候可以不指定队列的大小,默认和最大长度为2^31-1;由于读只操作对头,而写只操作队尾,这里巧妙地采用了两把锁,对于put和offer采用一把锁,对于take和poll则采用另外一把锁,避免了读写时互相竞争锁的情况,因此LinkedBlockingQueue在高并发读写操作都多的情况下,性能会较ArrayBlockingQueue好很多,在遍历以及删除元素则要两把锁都锁住。因为遍历和删除的时候不知道元素的具体位置。

PriorityBlockingQueue

基于堆实现的具有优先级的阻塞队列,默认长度为11,最大长度为2^31-8;队列中的元素必须是可比较的,即实现Comparable接口,或者在构建函数时提供可对队列元素进行比较的Comparator对象。

DelayQueue

DelayQueue是基于PriorityQueue实现的支持延时获取数据的队列。队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素。只有在延迟期满时才能从队列中提取元素

使用场景
  1. 缓存系统的设计:可以用DelayQueue保存缓存元素的有效期,使用一个线程循环查询DelayQueue,一旦能从DelayQueue中获取元素时,表示缓存有效期到了。

  2. 定时任务调度:使用DelayQueue保存当天将会执行的任务和执行时间,一旦从DelayQueue中获取到任务就开始执行,从比如TimerQueue就是使用DelayQueue实现的。

SynchronousQueue

一个不存储元素的阻塞队列,非常适合于传递性场景,比如在一个线程中使用的数据,传递给另外一个线程使用,SynchronousQueue的吞吐量高于LinkedBlockingQueue和ArrayBlockingQueue。

LinkedTransferQueue

基于链表的有界阻塞队列,相对于其他阻塞队列LinkedTransferQueue多了tryTransfer和transfer方法。

方法
  1. transfer(E e)
    若当前存在一个正在等待获取的消费者线程,即立刻移交之;否则,会插入当前元素e到队列尾部,并且等待进入阻塞状态,到有消费者线程取走该元素。
  2. tryTransfer(E e)
    若当前存在一个正在等待获取的消费者线程(使用take()或者poll()函数),使用该方法会即刻转移/传输对象元素e;
    若不存在,则返回false,并且不进入队列。这是一个不阻塞的操作。
  3. tryTransfer(E e, long timeout, TimeUnit unit)
    若当前存在一个正在等待获取的消费者线程,会立即传输给它; 否则将插入元素e到队列尾部,并且等待被消费者线程获取消费掉,
    若在指定的时间内元素e无法被消费者线程获取,则返回false,同时该元素被移除。
  4. hasWaitingConsumer()
    判断是否存在消费者线程
  5. getWaitingConsumerCount()
    获取所有等待获取元素的消费线程数量

LinkedBlockingDeque

是一个由链表结构组成的双向阻塞队列。所谓双向队列指的你可以从队列的两端插入和移出元素。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线...
    堤岸小跑阅读 468评论 0 2
  • 相关文章Java并发编程(一)线程定义、状态和属性 Java并发编程(二)同步Java并发编程(三)volatil...
    刘望舒阅读 5,294评论 1 31
  • 文/井底女蛙 初中时候,认识了鲁迅先生——伟大的无产阶级文学家、思想家、革命家。在很多人印象中,他冷酷无情。但是这...
    井底女蛙阅读 7,963评论 192 354
  • 社会太残酷,真心太难求, 风光时,哪里都是朋友, 落魄后,有谁给你帮助。 在当下浮躁的现实社会里, 会干的不如嘴甜...
    风情公子阅读 586评论 0 0
  • 莫名其妙的哼著“看見未來”的歌詞回家了。“我看見未來,看見未來”的歌詞縈繞在腦海裡,我認為我的潛意識都已經被周圍...
    市场部何荣阅读 144评论 0 0

友情链接更多精彩内容