阻塞队列

阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。

阻塞队列常用于生产者和消费者的场景:

当队列为空的,从队列中获取元素的操作将会阻塞;

当队列为满的,从队列中添加元素的操作将会阻塞;

所谓的阻塞:在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动被唤起。

阻塞队列的用处:不需要我们关心什么时候需要阻塞线程,什么时候需要唤醒线程。

BlockingQueue的实现类(比较常用):

  1. ArrayBlockingQueue:有数组结构组成的有界阻塞队列;
  2. LinkedBlockingQueue:有链表结构组成的有界(但大小默认值为Integer.MAX_VALUE)阻塞队列;
  3. SynchronousQueue:不存储元素的阻塞队列,即单个元素的队列。
方法类型 抛出异常 布尔值 阻塞 超时
插入 add(e) offer(e) put(e) offer(e,time,TimeUnit)
删除 remove() poll() take() poll(time,TimeUnit);
检查 element() peek() 不可用 不可用

抛出异常

  1. 当阻塞队列满时,再往队列里add插入元素会抛出IllegalStateException:Queue full
  2. 当队列为空时,再往队列中remove移除元素会抛NoSuchElementException
ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(3);
System.out.println(queue.add("a"));
System.out.println(queue.add("a"));
System.out.println(queue.add("a")); System.out.println(queue.remove());
System.out.println(queue.remove());
System.out.println(queue.remove());
System.out.println(queue.remove());

布尔值

  1. 插入方法,成功未true,失败为false
  2. 移除方法,成功返回队列的元素,队列没有就返回null
System.out.println(queue.offer("a"));
System.out.println(queue.offer("a"));
System.out.println(queue.offer("a")); System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println(queue.poll());

阻塞

  1. 当阻塞队列满时,生产者线程继续往队列里put元素,队列会一直阻塞生产者线程直到put数据or响应中断退出
  2. 当阻塞队列空时,消费者线程试图从队列里take元素,队列会一直阻塞消费者线程直到队列可用
queue.put("a");
queue.put("a");
queue.put("a");
//queue.put("a");
System.out.println(queue.take());
System.out.println(queue.take());
System.out.println(queue.take());
//System.out.println(queue.take());

超时

  1. 当阻塞队列满时,队列会阻塞生产者线程一定时间,超过限制后生产者线程会退出
queue.offer("a");
queue.offer("a");
queue.offer("a");
queue.offer("a",1L, TimeUnit.SECONDS); System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println(queue.poll());
queue.poll(1L,TimeUnit.SECONDS);

注意:

如果是无界阻塞队列,队列不可能会出现满的情况,所以使用put或offer方法永远不会被阻塞,而且使用offer方法时,该方法永远返回true

最新文章

  1. es6分享——变量的解构赋值
  2. Visual Studio 2015 下 编译 libpng
  3. html img src base64
  4. sphinx :undefined reference to `libiconv&#39; 报错解决办法
  5. 2014 Super Training #10 C Shadow --SPFA/随便搞/DFS
  6. HDU1001 关于累加公式的隐性类型转换
  7. jQuery滚动监听插件Waypoints
  8. 小知识 Vector的枚举 和foreach的用法
  9. 362. Design Hit Counter
  10. maven解决.lastUpdated maven无法下载jar
  11. &lt;frameset&gt;&lt;frame&gt;&lt;iframe&gt;网页框架
  12. c++编程思想(四)--对象和隐藏(感觉书上有误)
  13. log4j的Appenders配置
  14. SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装
  15. JProfiler - Java的性能监控工具
  16. C/C++ 知识点---存储区
  17. Again Stone Game
  18. php面向对象(OOP)编程完全教程(转载笔记,有兴趣可以看看))
  19. jsp内置对象-exception对象
  20. JAVA的下载与安装和环境变量配置等详细教程

热门文章

  1. ACwing1208. 翻硬币
  2. SpringBoot整合Netty实现socket通讯简单demo
  3. jQuery Validate验证(判断)某个字段是否通过验证
  4. 【LeetCode】859. Buddy Strings 解题报告(Python & C++)
  5. 【安卓】AndroidStudio使用本地gradle进行build的配置
  6. 『动善时』JMeter基础 — 60、固定吞吐量测试
  7. .NET 云原生架构师训练营(ASP .NET Core 整体概念推演)--学习笔记
  8. uniapp中scroll-view自定义滚动条
  9. MySQL数据库基础(2)表结构管理
  10. SpringCloud发现服务代码(EurekaClient,DiscoveryClient)