Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java并发编程工具类JUC之二:ArrayBlockingQueue队列

java并发编程工具类JUC之二:ArrayBlockingQueue队列

作者头像
字母哥博客
发布于 2021-03-27 09:41:39
发布于 2021-03-27 09:41:39
43700
代码可运行
举报
运行总次数:0
代码可运行

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BlockingQueue queue = new ArrayBlockingQueue(1024);
queue.put("1");   //向队列中添加元素
Object object = queue.take();   //从队列中取出元素

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1024);
queue.put("1");
String string = queue.take();

实现一个生产消费的实例

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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秒的间隔内,队列数据被消费者取走之后将导致消费者线程阻塞。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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将其打印出来。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的时候就已经进行过说明。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
juc03 数组阻塞队列—ArrayBlockingQueue
ArrayBlockingQueue实现了BlockingQueue接口。关于BlockingQueue的内容可以参考:juc02 阻塞队列—BlockingQueue
小诸葛
2020/04/14
3250
juc03 数组阻塞队列—ArrayBlockingQueue
juc02 阻塞队列—BlockingQueue
java的阻塞队列接口,java.util.concurrent.BlockingQueue,在添加、获取元素时是线程安全的。换句话说,多线程可以安全的从一个BlockingQueue接口中并发插入、获取元素,不会出现任何并发问题。
小诸葛
2020/04/14
3220
juc02 阻塞队列—BlockingQueue
深入探索Java并发编程:ArrayBlockingQueue详解
ArrayBlockingQueue是一个基于数组的有界阻塞队列。它在创建时需要指定队列的大小,并且这个大小在之后是不能改变的。队列中的元素按照FIFO(先进先出)的原则进行排序。ArrayBlockingQueue是线程安全的,可以在多线程环境下安全地使用。
公众号:码到三十五
2024/03/19
8590
并发工具箱 concurrent包的原理分析以及使用
BlockingQueue 通常用于一个线程生产对象,而另外一个线程消费这些对象的场景。下图是对这个原理的阐述:
小勇DW3
2018/08/30
8520
并发工具箱 concurrent包的原理分析以及使用
如何实现Java并发编程中的生产者-消费者模式
在Java并发编程中,生产者-消费者模式是一种经典的多线程通信模式。其主要思想是由一个或多个生产者向共享的数据缓冲区中不断生产数据,同时一个或多个消费者从共享的数据缓冲区中不断消费数据。下面将探讨如何实现Java并发编程中的生产者-消费者模式。
用户1289394
2024/03/07
1760
如何实现Java并发编程中的生产者-消费者模式
多线程设计模式解读4—Producer-Consumer模式
Producer-Consumer模式可以说是多线程设计模式之王,后期我们要讲的许多模式像Thread-Pool模式,Active Object模式等都是Producer-Consumer模式的变种。Producer-Consumer模式中的生产者和消费者阻塞唤醒机制可以通过Guarded Suspension模式实现。
java达人
2018/10/08
1.1K0
多线程设计模式解读4—Producer-Consumer模式
java并发编程学习: 阻塞队列 使用 及 实现原理
队列(Queue)与栈(Stack)是数据结构中的二种常用结构,队列的特点是先进先出(First In First Out),而Stack是先进后出(First In Last Out),说得通俗点:Queue就是电影院入场时人们排起来的进场队伍,先来的人(即:前排在前面的人)先入场,而Statck则是一队人依次进入了一个死胡同想出来,先进去(最里面)的人,必须等后面的人(后进入的人)出来了,自己才能出来。 队列在多线程应用中,常用于生产-消费场景,打个通俗的比方:很多人早上喜欢去买油条,买油条的人相当于消
菩提树下的杨过
2018/01/18
9670
Java中Queue和BlockingQueue的区别
1.BlockingQueue:支持两个附加操作的 Queue,这两个操作是:检索元素时等待队列变为非空,以及存储元素时等待空间变得可用。   2.BlockingQueue 不接受 null 元素。   3.BlockingQueue 可以是限定容量的。   4.BlockingQueue 实现是线程安全的。Queue不是线程安全的。因此可以将Blockingqueue用于用于生产者-使用者队列。   根据Api修改的一个例子,大家可以修改自己体验BlockingQueue的使用   pa
cloudskyme
2018/03/20
6860
Java并发阻塞队列BlockingQueue概览
java.util.concurrent包下的 BlockingQueue 接口规范了一个放数据、取数据都是线程安全的队列。
青山师
2023/05/04
3410
Java并发阻塞队列BlockingQueue概览
Java并发编程学习12-任务取消和线程中断
开始之前,引用一篇《C#一分钟浅谈:Blazor WebAssembly 开发》,该文详细介绍了Blazor WebAssembly的基本概念、常见问题及解决方案,并分享了一些易错点及如何避免的方法,有需要的朋友可以参考参考
huazie
2024/11/16
2110
Java并发编程学习12-任务取消和线程中断
Java并发编程学习7-阻塞队列
介绍阻塞队列之前,先来介绍下队列 Queue。Queue 用来临时保存一组等待处理的元素。它提供了几种非阻塞队列实现,如下:
huazie
2024/09/24
1600
Java并发编程学习7-阻塞队列
Java多线程编程(四)- 阻塞队列,生产者消费者模型,线程池
1.1.当队列满的时候, 继续入队列就会阻塞, 直到有其他线程从队列中取走元素 
用户11305962
2024/11/21
4300
Java多线程编程(四)- 阻塞队列,生产者消费者模型,线程池
详解Java并发编程之阻塞队列
在Java并发编程中,阻塞队列(BlockingQueue)是一个非常有用的工具。它是一个线程安全的队列,支持生产者-消费者模式,可以解决多线程并发访问的问题。本文将详细介绍阻塞队列的基本概念、实现原理、使用场景以及注意事项。
用户1289394
2023/08/22
4130
详解Java并发编程之阻塞队列
Java 阻塞队列 BlockingQueue 详解: 生产者消费者问题
生产者消费者问题的任何有效解决方案都必须控制对产生资源的生产的put() 方法的调用以及对消耗资源的消费者的 take() 方法的调用。一旦实现了对方法阻塞的控制,就可以解决问题。
一个会写诗的程序员
2020/04/24
2.5K0
Java 阻塞队列 BlockingQueue 详解: 生产者消费者问题
【Java并发编程三】多线程案例(手撕单例模式,阻塞队列,定时器,线程池)
单例模式具体的实现方式 , 有非常多种,本篇文章主要讲述“饿汉模式”和“懒汉模式”两种方法。
小皮侠
2024/10/17
1600
为何我建议你学会Queue集合
PriorityQueue的底层数据结构就如andrewlock.net网站提供的图一样,虽然PriorityQueue是一个平衡二叉堆,但JDK底层的实现却是:一个普普通通的二维数组!!
JavaSouth南哥
2024/09/03
2700
为何我建议你学会Queue集合
Java并发基础:ArrayBlockingQueue全面解析!
ArrayBlockingQueue类是一个高效、线程安全的队列实现,它基于数组,提供了快速的元素访问,并支持多线程间的同步操作,作为有界队列,它能有效防止内存溢出,并通过阻塞机制平衡生产者和消费者的速度差异,它还提供了公平性和非公平性策略,满足不同场景下的需求。
程序员古德
2024/02/08
2820
Java并发基础:ArrayBlockingQueue全面解析!
Java并发编程学习14-探索基于线程的服务如何优雅关闭
开始之前,引用一篇《Bug回忆录 | jvisualvm如何定位程序性能问题》,该文详细介绍了Java 性能分析和调优工具 jvisualvm,其为开发者提供了详细的内存使用情况、垃圾回收情况、CPU 使用情况等多维度的信息。有需要的朋友可以使用起来。
huazie
2024/11/29
1410
Java并发编程学习14-探索基于线程的服务如何优雅关闭
一文带你彻底掌握阻塞队列!
在之前的文章中,我们介绍了生产者和消费者模型的最基本实现思路,相信大家对它已经有一个初步的认识。
Java极客技术
2023/11/16
7910
一文带你彻底掌握阻塞队列!
BlockingQueue学习
在java.util.Concurrent包中,BlockingQueue很好的解决了在多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。同时,BlockingQueue也用于java自带线程池的缓冲队列中,了解BlockingQueue也有助于理解线程池的工作模型。
zhangheng
2020/04/28
6570
推荐阅读
相关推荐
juc03 数组阻塞队列—ArrayBlockingQueue
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验