写在前面

最近,有不少网友留言提问:在Java的并发编程中,有个BlockingQueue,它是个阻塞队列,为何要在并发编程里使用BlockingQueue呢?好吧,今天,就临时说一下BlockingQueue吧,不过今天说的不是很深入,后面咱们一起从源头上深入剖析这个类。

BlockingQueue概述

阻塞队列,是线程安全的。

被阻塞的情况如下:

(1)当队列满时,进行入队列操作

(2)当队列空时,进行出队列操作

使用场景如下:

主要在生产者和消费者场景。

BlockingQueue的方法

BlockingQueue 具有 4 组不同的方法用于插入、移除以及对队列中的元素进行检查。如果请求的操作不能得到立即执行的话,每个方法的表现也不同。这些方法如下:

抛出异常 特殊值 阻塞 超时
插入 add(e) offer(e) put(e) offer(e, time, unit)
移除 remove() poll() take() poll(time, unit)
检查 element() peek() 不可用 不可用



四组不同的行为方式解释

  • 抛出异常

如果试图的操作无法立即执行,抛一个异常。

  • 特殊值

如果试图的操作无法立即执行,返回一个特定的值(常常是 true / false)。

  • 阻塞

如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行。

  • 超时

如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行,但等待时间不会超过给定值。返回一个特定值以告知该操作是否成功(典型的是 true / false)。

BlockingQueue的实现类

  • ArrayBlockingQueue:有界的阻塞队列(容量有限,必须在初始化的时候指定容量大小,容量大小指定后就不能再变化),内部实现是一个数组,以FIFO的方式存储数据,最新插入的对象是尾部,最新移除的对象是头部。
  • DelayQueue:阻塞的是内部元素,DelayQueue中的元素必须实现一个接口——Delayed(存在于J.U.C下)。Delayed接口继承了Comparable接口,这是因为Delayed接口中的元素需要进行排序,一般情况下,都是按照Delayed接口中的元素过期时间的优先级进行排序。应用场景主要有:定时关闭连接、缓存对象、超时处理等。内部实现使用PriorityQueue和ReentrantLock。
  • LinkedBlockingQueue:大小配置是可选的,如果初始化时指定了大小,则是有边界的;如果初始化时未指定大小,则是无边界的(其实默认大小是Integer类型的最大值)。内部实现时一个链表,以FIFO的方式存储数据,最新插入的对象是尾部,最新移除的对象是头部。
  • PriorityBlockingQueue:带优先级的阻塞队列,无边界,但是有排序规则,允许插入空对象(也就是null)。所有插入的对象必须实现Comparable接口,队列优先级的排序规则就是按照对Comparable接口的实现来定义的。可以从PriorityBlockingQueue中获得一个迭代器Iterator,但这个迭代器并不保证按照优先级的顺序进行迭代。
  • SynchronousQueue:队列内部仅允许容纳一个元素,当一个线程插入一个元素后,就会被阻塞,除非这个元素被另一个线程消费。因此,也称SynchronousQueue为同步队列。SynchronousQueue是一个无界非缓存的队列。准确的说,它不存储元素,放入元素只有等待取走元素之后,才能再次放入元素。

写在最后

如果觉得文章对你有点帮助,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发编程技术。

最后,附上并发编程需要掌握的核心技能知识图,祝大家在学习并发编程时,少走弯路。

最新文章

  1. JS 数据类型转换
  2. Echarts3 关系图-力导向布局图
  3. error C3861: “LOG4CPLUS_DEBUG”: 找不到标识
  4. C# 循环语句 for循环
  5. 第三方开源水面波浪波形view:WaveView
  6. 三步搞定ISO/GHO安装系统 - imsoft.cnblogs
  7. Unity笔记
  8. js将对象转成字符串-支持微信
  9. hdu 3709 数字dp(小思)
  10. Linux下磁盘监控及系统版本-CPU-内存等查看
  11. python matplotlib 简单生成图
  12. 【转】priority_queue优先队列
  13. Python——高阶函数——map filter zip
  14. mongoDB 大文件存储方案, JS 支持展示
  15. pc远程控制凭证不工作的解决办法
  16. 【Luogu4931】情侣?给我烧了! 加强版(组合计数)
  17. nagios系列(七)nagios通过自定义脚本的方式监控mysql主从同步
  18. 【转】彻底搞清C#中cookie的内容
  19. 说一下PHP中die()和exit()区别
  20. Spring-boot JMS 发送消息慢的问题解决

热门文章

  1. 3000字编程入门--附带Java学习路线及视频
  2. 【转】Kerberos简介
  3. 如何简单的将手机投屏在windows上(可在电脑上直接操作手机)
  4. 解开SQL注入的神秘面纱-来自于宋沄剑的分享
  5. snmap弱口令攻击利用
  6. PHP session反序列化
  7. 我的Keras使用总结(3)——利用bottleneck features进行微调预训练模型VGG16
  8. golang工具之present - 编写go特色的ppt
  9. Anomaly Detection-异常检测算法(Coursera-Ng-ML课程)
  10. 支持向量机(Support Vector Machine)