BlockingQueue

概要

BolckingQueue可用于解决并发生产者-消费者问题,能保证任意时刻只有一个线程可以进行take或者put操作,并且BlockQueue提供了超时return null的机制。

队列类型
  • 无限队列-几乎可以无限增长
  • 有限队列-定义了最大容量
队列的数据结构
  • 通常使用链表或数组实现
  • 一般而言队列具备先进先出的特性,当然也有双端队列,优先级队列
  • 主要操作:入队(EnQueue)与出队(DeQueue)
  • 常见的4种阻塞队列:
    ArrayBlockingQueue由数组支持的有界队列
    LinkedBlockingQueue由连接节点支持的可选有界队列
    PriorityBlockingQueue由优先级堆实现的无界优先级队列
    DelayQueue由优先级堆支持的、基于时间的调度队列
ArrayBlockingQueue

队列基于数组实现,容量大小在创建ArrayBlockingQueue对象时已经定义好,基于ReentrantLock保证线程安全,根据条件队列实现对列满时的阻塞。在线程池中有比较多的使用,生产着消费者场景。

LinkedBlockingQueue

是一个基于链表的无界队列,向无限队列中添加元素的所有操作都将永远不会阻塞,因此它可以增长到非常大的容量。
使用LinkedBlockingQueue设计生产者消费者模型时最重要的是消费者应该能工像生产者向队列添加消息一样地消费消息。否则,内存可能会填满,然后就会得到一个OutOfMemory异常。

DelayQueue

由优先堆支持的、基于时间的调度队列,内部基于无界队列Priority实现,而无界队列基于数组的扩容实现。入队的对象必须要实现Delayed接口,而Delayed集成自Comparable接口,队列内部会根据时间优先级进行排序。延迟类线程池周期进行。

API

添加元素

方法说明
add()如果插入成功则返回 true,否则抛出 IllegalStateException 异常
put()将指定的元素插入队列,如果对列满了,那么会阻塞知道有空间插入
offer()如果插入成功则返回 true,否则返回false
offer(E e,long timeout,TimeUnit unit)尝试将元素插入队列,如果对列已满,那么会阻塞直到有空间插入

检查元素

方法说明
take()获取队列的头部元素并将其删除,如果对列为空,则阻塞并等待元素变为可用
pool(long timeout,TimeUnit unit)检索并删除队列的头部,如果有必要,等待指定的等待时间以使元素可用,如果超时,则返回null
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jzs1064

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值