ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JUC之阻塞队列(BlockingQueue)基础

2022-01-13 09:31:09  阅读:168  来源: 互联网

标签:JUC 队列 System 阻塞 queue println out BlockingQueue


阻塞队列

阻塞队列(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

标签:JUC,队列,System,阻塞,queue,println,out,BlockingQueue
来源: https://www.cnblogs.com/xbhog/p/15793171.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有