java中的BlockingQueue(阻塞队列)解析

 更新时间:2023年12月18日 08:43:44   作者:暴躁的程序猿啊  
这篇文章主要介绍了java中的BlockingQueue阻塞队列解析,阻塞队列是一个支持两个附加操作的队列,这两个附加的操作是,在队列为空时,获取元素的线程会等待队列变为非空,需要的朋友可以参考下

BlockingQueue

阻塞队列(BlockingQueue) 是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。

当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。

阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。

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

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

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

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

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

JDK中七个队列

  1. ArrayBolckingQueue(常用):基于数组的有界阻塞队列
  2. LinkedBlockingQueue(常用):基于链表的有界阻塞队列 大小默认为 Integer最大值
  3. PriorityBlockingQueue : 一个支持优先级排序的无界阻塞队列。
  4. DelayQueue: 使用优先级队列实现的延迟无界阻塞队列
  5. SynchronousQueue: 一个不存储元素的阻塞队列。
  6. LinkedTransferQueue: 一个由链表结构组成的无界阻塞队列。
  7. LinkedBlockingDeque: 一个由链表结构组成的双向阻塞队列

阻塞队列核心方法

方法类型抛出异常特殊值( 有返回值)阻塞超时
插入addofferputoffer
移除removepolltakepoll
判断队列首elementpeek--

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添加成功返回true
        System.out.println(arrayBlockingQueue.add("1"));
        System.out.println(arrayBlockingQueue.add("2"));
        System.out.println(arrayBlockingQueue.add("3"));
        //查看队首的元素是谁 1
        System.out.println(arrayBlockingQueue.element());
        //超过队列大小 add会抛出异常  Queue full
//        System.out.println(arrayBlockingQueue.add("4"));
        //remove取出一个元素  返回取出的值   如果队列为空  remove会抛出异常
        // NoSuchElementException
        System.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失败返回true
        System.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  取出一个元素  返回一个元素    队列为空时 取出null
        System.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();
        }
    }

在这里插入图片描述

到此这篇关于java中的BlockingQueue(阻塞队列)解析的文章就介绍到这了,更多相关BlockingQueue阻塞队列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • jpa onetomany 使用级连表删除被维护表数据时的坑

    jpa onetomany 使用级连表删除被维护表数据时的坑

    这篇文章主要介绍了jpa onetomany 使用级连表删除被维护表数据时的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java5种遍历HashMap数据的写法

    Java5种遍历HashMap数据的写法

    这篇文章主要介绍了Java5种遍历HashMap数据的写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • java dump文件怎么生成和分析-JMAP用法详解

    java dump文件怎么生成和分析-JMAP用法详解

    这篇文章主要介绍了java dump文件怎么生成和分析-JMAP用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 在Java生产环境下进行性能监控与调优的详细过程

    在Java生产环境下进行性能监控与调优的详细过程

    在Java生产环境下进行性能监控与调优是一个复杂但重要的过程,它涉及到多个方面,包括代码分析、JVM监控、线程管理、垃圾收集优化、内存管理、数据库交互等,下面我将提供一个详细的概述和示例代码,需要的朋友可以参考下
    2025-02-02
  • java编译后的文件出现xx$1.class的原因及解决方式

    java编译后的文件出现xx$1.class的原因及解决方式

    这篇文章主要介绍了java编译后的文件出现xx$1.class的原因及解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 关于Arrays.sort()使用的注意事项

    关于Arrays.sort()使用的注意事项

    这篇文章主要介绍了关于Arrays.sort()使用的注意事项,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Java垃圾回收之标记清除算法详解

    Java垃圾回收之标记清除算法详解

    今天小编就为大家分享一篇关于Java垃圾回收之标记清除算法详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • Java开发基础日期类代码详解

    Java开发基础日期类代码详解

    这篇文章主要介绍了Java开发基础日期类的相关内容,代码通过日期工具类获取指定月份的星期与日期对应关系,以及获取指定月份的所有日期与星期集合等,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • Log4j按级别输出日志到不同文件的实现方法

    Log4j按级别输出日志到不同文件的实现方法

    下面小编就为大家带来一篇Log4j按级别输出日志到不同文件的实现方法。
    2016-11-11
  • Java集合框架之LinkedHashSet类解读

    Java集合框架之LinkedHashSet类解读

    这篇文章主要介绍了Java集合框架之LinkedHashSet类解读,LinkedHashSet是HashSet的有序版本,它跨所有元素维护一个双向链接的List,当需要维护迭代顺序时,就使用这个类,当遍历HashSet时,顺序是不可预测的,需要的朋友可以参考下
    2023-09-09

最新评论