BlockingQueue

阻塞队列(BlockingQueue) 是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。

使用场景: 多线程并发处理,线程池!

队列 FIFO先进先出 一端写入一端取出

写入如果队列满了就必须阻塞等待 如果队列是空的必须阻塞等待生产

注意:BlockingQueue 不接受null值 试图添加一个null元素时会抛出异常

BlockingQueue 可以是限定容量的 超过给定容量时是无法添加的

JDK中七个队列

ArrayBolckingQueue(常用):基于数组的有界阻塞队列

LinkedBlockingQueue(常用):基于链表的有界阻塞队列 大小默认为 Integer最大值

PriorityBlockingQueue : 一个支持优先级排序的无界阻塞队列。

DelayQueue: 使用优先级队列实现的延迟无界阻塞队列

SynchronousQueue: 一个不存储元素的阻塞队列。

LinkedTransferQueue: 一个由链表结构组成的无界阻塞队列。

LinkedBlockingDeque: 一个由链表结构组成的双向阻塞队列

阻塞队列核心方法

方法类型 抛出异常 特殊值( 有返回值) 阻塞 超时
插入 add offer put offer
移除 remove poll take poll
判断队列首 element peek - -

ArrayBolckingQueue使用示例:

演示各个API的使用

public class Test {public static void main(String[] args) {test1();}

第一组会抛出异常API演示 add remove element

   /*** 抛出异常*/public static void test1(){//指定队列大小ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue<>(3);//add添加成功返回trueSystem.out.println(arrayBlockingQueue.add("1"));System.out.println(arrayBlockingQueue.add("2"));System.out.println(arrayBlockingQueue.add("3"));//查看队首的元素是谁 1System.out.println(arrayBlockingQueue.element());//超过队列大小 add会抛出异常  Queue full
//        System.out.println(arrayBlockingQueue.add("4"));//remove取出一个元素  返回取出的值   如果队列为空  remove会抛出异常// NoSuchElementExceptionSystem.out.println(arrayBlockingQueue.remove());System.out.println(arrayBlockingQueue.remove());System.out.println(arrayBlockingQueue.remove());System.out.println(arrayBlockingQueue.remove());}


第二组API使用

public static void test1(){//队列的大小ArrayBlockingQueue<Object> blockingQueue = new ArrayBlockingQueue<>(2);//offer  添加一个元素  返回一个boolean值   成功返回true失败返回trueSystem.out.println(blockingQueue.offer(1));System.out.println(blockingQueue.offer(2));System.out.println(blockingQueue.offer(3));System.out.println("----------------");//检测队首元素System.out.println(blockingQueue.peek());//poll  取出一个元素  返回一个元素    队列为空时 取出nullSystem.out.println(blockingQueue.poll());System.out.println(blockingQueue.peek());System.out.println(blockingQueue.poll());System.out.println(blockingQueue.poll());}


第三组阻塞API使用

放不进去了会一直阻塞直到有空位

/*** 等待 一直阻塞*/public static void test1(){ArrayBlockingQueue<Object> blockingQueue = new ArrayBlockingQueue<>(2);try {//put添加元素 没有返回值 满了一直阻塞//队列大小为二   第三个元素放不进去   阻塞两秒过后就会结束blockingQueue.put("1");blockingQueue.put("2");blockingQueue.put("3");} catch (InterruptedException e) {e.printStackTrace();}try {//取出元素  空了一直阻塞  返回值取出的元素System.out.println(blockingQueue.take());;System.out.println(blockingQueue.take());System.out.println(blockingQueue.take());} catch (InterruptedException e) {e.printStackTrace();}}


第四组API使用

设置阻塞时间 超过阻塞时间没放进去就放弃等待

 /*** 等待  超时阻塞*/public static void test4(){ArrayBlockingQueue<Object> blockingQueue = new ArrayBlockingQueue<>(2);try {//参数 插入的数值  超时时间 和 单位blockingQueue.offer("1");blockingQueue.offer("2");blockingQueue.offer("3",2, TimeUnit.SECONDS);System.out.println("------");System.out.println(blockingQueue.poll());System.out.println(blockingQueue.poll());System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));} catch (InterruptedException e) {e.printStackTrace();}}

BlockingQueue(阻塞队列)相关推荐

  1. Java并发编程-BlockingQueue阻塞队列

    BlockingQueue阻塞队列 1.BlockingQueue介绍 1.1.引言: 1.2.阻塞队列介绍: 1.3.阻塞队列的用处: 1.4.接口架构图 2.BlockingQueue核心方法 3 ...

  2. BlockingQueue阻塞队列原理以及实现

    BlockingQueue原理以及实现 一,BlockingQueue 1,主要常用的队列有如下 2,基本工作原理实现如下 3,基本api使用如下 二,源码剖析 2.1,ArrayBlockingQu ...

  3. BlockingQueue阻塞队列及其实现

    转自:https://www.jianshu.com/p/7b2f1fa616c6 1. 前言 BlockingQueue即阻塞队列,它是基于ReentrantLock,依据它的基本原理,我们可以实现 ...

  4. Java进阶:BlockingQueue阻塞队列的使用

    文章目录 1. 概述 2. 常用的阻塞队列 3. 操作方法 3.1 抛出异常 3.2 特殊值 3.3 阻塞 3.4 超时 1. 概述 相比平时讨论的队列,阻塞队列增加了阻塞的功能: 当有限长度的队列填 ...

  5. BlockingQueue阻塞队列

  6. java多线程队列_java多线程消费者生产者模式(BlockingQueue 通过阻塞队列实现)

    import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; /** * Cr ...

  7. BlockingQueue(阻塞队列)详解

    推荐:Java并发编程汇总 BlockingQueue(阻塞队列)详解 原文地址 BlockingQueue 一. 前言 在新增的Concurrent包中,BlockingQueue很好的解决了多线程 ...

  8. 浅谈Java锁,与JUC的常用类,集合安全类,常用辅助类,读写锁,阻塞队列,线程池,ForkJoin,volatile,单例模式不安全,CAS,各种锁

    浅谈JUC的常用类 JUC就是java.util.concurrent-包下的类 回顾多线程 Java默认有几个线程? 2 个 mian.GC Java 真的可以开启线程吗? 开不了,点击源码得知:本 ...

  9. 阻塞队列-BlockningQueue

    阻塞队列的前言介绍引用于https://www.cnblogs.com/aspirant/p/8657801.html,写的挺好有兴趣可以看一看 一. 前言 在新增的Concurrent包中,Bloc ...

最新文章

  1. php屏蔽审查元素,前端:屏蔽F12审查元素,禁止修改页面代码
  2. mysql插入数据显示中文乱码
  3. All About Angular 2.0
  4. Oracle学习笔记之三,Oracle 11g数据库的启动与关闭
  5. Python 2.7版本与3.6的不同
  6. reactjs组件通信方式总结
  7. python连接oracle进行监控_使用Python脚本zabbix自定义key监控oracle连接状态
  8. 【转载】interpolation(插值)和 extrapolation(外推)的区别
  9. 微软公布Netgear 固件严重漏洞详情,可盗取用户身份并攻陷系统
  10. 深入理解Java8 Lambda表达式
  11. 51单片机+DS18B20+LCD1602显示+Proteus仿真
  12. MATLAB-二次曲面
  13. Arduino控制PS2无线手柄
  14. Newifi mini R6850/R6830路由器刷breed+Padavan固件
  15. MFC ListCtrl的cheek框的全选和反选
  16. BUUCTF刷题记录 Harley Quinn
  17. 如何利用社交媒体进行跨境电商营销—扬帆际海
  18. 【c++基础】第五章 RALL机制与智能指针
  19. ASN.1的PER编码例子
  20. 计划,单元整账户结构案例

热门文章

  1. 三星手机出现com.sec.android.app.sa,如何去除Galaxy S20/S20 /Ultra/S10/系统内置的Bixby三星Pay等软件Ap......
  2. 小程序手机号码中间四位隐藏
  3. 连接到服务器 ------------------------------ 无法连接到 + SQL Server 请求失败或服务未及时响应....解决思路
  4. 将一个数组中重复的元素去除,并且返回一个新数组
  5. 新手小心:c语言的强符号和弱符号
  6. 苏宁易购商品详情API接口
  7. CentOS 7 服务器密码忘记的解决办法
  8. thinkphp创建临时表
  9. ios运行html时黑屏,iOS-启动图黑屏解决方法
  10. 神经网络学习笔记(五) 径向基函数神经网络