java并发编程工具类JUC之ArrayBlockingQueue

 更新时间:2021年05月31日 15:45:34   作者:字母哥博客  
类ArrayBlockingQueue是BlockingQueue接口的实现类,它是有界的阻塞队列,内部使用数组存储队列元素,通过代码给大家说明如何初始化一个ArrayBlockingQueue,并向其中添加一个对象,对java并发编程工具类ArrayBlockingQueue相关知识感兴趣的朋友一起看看吧

Java BlockingQueue接口java.util.concurrent.BlockingQueue表示一个可以存取元素,并且线程安全的队列。换句话说,当多线程同时从 JavaBlockingQueue中插入元素、获取元素的时候,不会导致任何并发问题(元素被插入多次、处理多次等问题)。

从java BlockingQueue可以引申出一个概念:阻塞队列,是指队列本身可以阻塞线程向队列里面插入元素,或者阻塞线程从队列里面获取元素。比如:当一个线程尝试去从一个空队列里面获取元素的时候,这个线程将被阻塞直到队列内元素数量不再为空。当然,线程是否会被阻塞取决于你调用什么方法从BlockingQueue获取元素,有的方法会阻塞线程,有的方法会抛出异常等等,下文我们会详细介绍。

ArrayBlockingQueueBlockingQueue接口的实现类,它是有界的阻塞队列,内部使用数组存储队列元素。这里的“有界”是指存储容量存在上限,不能无限存储元素。在同一时间内存储容量存在着一个上限值,这个上限制在初始实例化的时候指定,之后便不能修改了。

ArrayBlockingQueue内部采用FIFO (First In, First Out)先进先出的方法实现队列数据的存取,队首的元素是在队列中保存时间最长的元素对象,队尾的元素是在队列中保存时间最短的元素对象。

下面的代码说明如何初始化一个ArrayBlockingQueue,并向其中添加一个对象:

BlockingQueue queue = new ArrayBlockingQueue(1024);
queue.put("1");   //向队列中添加元素
Object object = queue.take();   //从队列中取出元素

BlockingQueue可以通过泛型来限定队列中存储数据的类型,下面的代码以String为泛型,表示该队列只能存储String类型。

BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1024);
queue.put("1");
String string = queue.take();

实现一个生产消费的实例

在前面的文章中我们曾经讲过:BlockingQueue经常被用于生产消费的缓冲队列。下面我们就使用ArrayBlockingQueue来真正的实现一个生产消费的例子。

BlockingQueueExample开启两个独立线程,一个是Producer生产者线程,负责向队列中添加数据;另一个是Consumer消费者线程,负责从队列中取出数据进行处理。

public class BlockingQueueExample {

    public static void main(String[] args) throws Exception {
        //使用ArrayBlockingQueue初始化一个BlockingQueue,指定容量的上限为1024
        BlockingQueue queue = new ArrayBlockingQueue(1024);
        
        Producer producer = new Producer(queue);  //生产者
        Consumer consumer = new Consumer(queue);  //消费者

        new Thread(producer).start();  //开启生产者线程
        new Thread(consumer).start();  //开启消费者线程

        Thread.sleep(4000);
    }
}

Producer为生产者,每隔10秒钟使用put()方法向队列中放入一个对象,放入三次。在这10秒的间隔内,队列数据被消费者取走之后将导致消费者线程阻塞。

public class Producer implements Runnable{

    protected BlockingQueue queue = null;

    public Producer(BlockingQueue queue) {
        this.queue = queue;
    }

    public void run() {
        try {
            queue.put("1");
            Thread.sleep(10000);
            queue.put("2");
            Thread.sleep(10000);
            queue.put("3");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

下面的代码是消费者类Consumer,它从队列中获取待处理的元素对象,并调用System.out将其打印出来。

public class Consumer implements Runnable{

    protected BlockingQueue queue = null;

    public Consumer(BlockingQueue queue) {
        this.queue = queue;
    }

    public void run() {
        try {
            System.out.println(queue.take());
            System.out.println(queue.take());
            System.out.println(queue.take());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

上面的代码打印结果是每隔10秒打印一次,因为其中take()方法在队列内没有元素可以取到的时候,会阻塞当前的消费者线程,让其处于等待状态,这个方法我们在上一节介绍BlockingQueue的时候就已经进行过说明。

以上就是java并发编程工具类JUC之ArrayBlockingQueue的详细内容,更多关于java并发编程工具类ArrayBlockingQueue的资料请关注脚本之家其它相关文章!

相关文章

  • Mybatis中TypeHandler使用小结

    Mybatis中TypeHandler使用小结

    MyBatis的TypeHandler是一个强大的机制,它为我们提供了一种灵活的方式来处理Java类型与数据库类型之间的转换,本文主要介绍了Mybatis中TypeHandler使用小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • 在java程序中使用protobuf

    在java程序中使用protobuf

    这篇文章主要介绍了protobuf的基本使用和同java结合的具体案例,感性兴趣的小伙伴可以一起来阅读下文
    2021-08-08
  • Java实现抽奖算法的示例代码

    Java实现抽奖算法的示例代码

    这篇文章主要为大家详细介绍了如何利用Java语言实现抽奖算法,文中的示例代码讲解详细,对我们学习Java有一定帮助,需要的可以参考一下
    2022-04-04
  • Spring MVC 图片的上传和下载功能

    Spring MVC 图片的上传和下载功能

    SSM 框架是一种基于Java的Web开发框架,其中Spring作为控制层、SpringMVC作为视图层、MyBatis作为持久层,这个框架非常适合Web应用程序的开发,这篇文章主要介绍了Spring MVC 图片的上传和下载功能,需要的朋友可以参考下
    2023-03-03
  • java8中lamba表达式的使用

    java8中lamba表达式的使用

    这篇文章主要介绍了java8中lamba表达式的使用,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • 浅析SpringBoot多数据源实现方案

    浅析SpringBoot多数据源实现方案

    现在很多项目的开发过程中,可能涉及到多个数据源,像读写分离的场景,或者因为业务复杂,导致不同的业务部署在不同的数据库上,那么这样的场景,我们应该如何在代码中简洁方便的切换数据源呢,本文介绍SpringBoot多数据源实现方案,感兴趣的朋友跟随小编一起看看吧
    2024-02-02
  • hibernate-validator如何使用校验框架

    hibernate-validator如何使用校验框架

    高效、合理的使用hibernate-validator校验框架可以提高程序的可读性,以及减少不必要的代码逻辑,本文主要介绍了hibernate-validator如何使用校验框架,感兴趣的可以了解一下
    2022-04-04
  • 详解JAVA流程控制语句

    详解JAVA流程控制语句

    这篇文章主要介绍了Java中的流程控制语句,循环等语句是Java编程中流程控制的基础,需要的朋友可以参考下
    2017-04-04
  • SpringBoot AOP使用笔记

    SpringBoot AOP使用笔记

    今天小编就为大家分享一篇关于SpringBoot AOP使用笔记,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java使用二分法进行查找和排序的示例

    Java使用二分法进行查找和排序的示例

    这篇文章主要介绍了Java使用二分法进行查找和排序的示例,二分插入排序和二分查找是基础的算法,需要的朋友可以参考下
    2016-04-04

最新评论