Java concurrency集合之ArrayBlockingQueue_动力节点Java学院整理

yizhihongxing

Java Concurrency集合之ArrayBlockingQueue

什么是ArrayBlockingQueue

ArrayBlockingQueue是Java提供的一个有界队列,它是按照FIFO(先进先出)的顺序对元素进行存储和访问的。它支持多线程,即多个线程可同时访问该队列,因此被称为Java Concurrency集合之一。

ArrayBlockingQueue的实现原理

ArrayBlockingQueue内部基于数组实现,它封装了一个固定长度的数组,该数组用于存储添加到队列中的元素。当队列的容量被占满时,ArrayBlockingQueue将阻止更多的元素被添加到队列中,直到队列中的其他元素被访问并删除,才能继续添加新的元素。

ArrayBlockingQueue的使用

创建ArrayBlockingQueue

使用ArrayBlockingQueue需要在导入Java.util.concurrent包后通过构造函数创建实例,构造函数接受两个参数:

  • int capacity:队列的容量
  • boolean fair:是否按公平原则创建队列
ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10, true);

添加元素到ArrayBlockingQueue

当队列未满时,使用addput方法将一个元素添加到队列中。

try {
    queue.add(1); //添加元素到队列尾部
    queue.put(2); //添加元素到队列尾部,阻塞当前线程直至队列有空位
} catch (InterruptedException e) {
    e.printStackTrace();
}

从ArrayBlockingQueue中取出元素

当队列非空时,使用removetake方法从队列中取出并移除一个元素。

try {
    Integer num1 = queue.remove(); //从队列头部获取元素并移除
    Integer num2 = queue.take();   //从队列头部获取元素并移除,阻塞当前线程直至队列非空
} catch (InterruptedException e) {
    e.printStackTrace();
}

获取ArrayBlockingQueue的大小或剩余空间

使用sizeremainingCapacity方法获取队列的大小或未被填满的剩余空间。

System.out.println("队列大小:" + queue.size()); 
System.out.println("队列中剩余空间:" + queue.remainingCapacity());

示例说明

示例1:生产者和消费者模式

import java.util.concurrent.ArrayBlockingQueue;

public class ProducerConsumerDemo {
    public static void main(String[] args) {
        ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10, true);
        new Thread(new Producer(queue)).start(); //启动生产者线程
        new Thread(new Consumer(queue)).start(); //启动消费者线程
    }
}

//生产者线程
class Producer implements Runnable {
    private ArrayBlockingQueue<Integer> queue;
    public Producer(ArrayBlockingQueue<Integer> queue) {
        this.queue = queue;
    }
    @Override
    public void run() {
        for (int i = 1; i <= 10; i++) {
            try {
                queue.put(i);  //将元素放入队列
                System.out.println("生产者生产了:" + i);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

//消费者线程
class Consumer implements Runnable {
    private ArrayBlockingQueue<Integer> queue;
    public Consumer(ArrayBlockingQueue<Integer> queue) {
        this.queue = queue;
    }
    @Override
    public void run() {
        for (int i = 1; i <= 10; i++) {
            try {
                int num = queue.take(); //从队列中取出元素
                System.out.println("消费者消费了:" + num);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

在该示例中,生产者将1~10的数字添加到了队列中,而消费者从队列中取出这些元素,并进行消费。因为在队列满时生产者线程将会被阻塞,而在队列空时消费者线程也同样会被阻塞,因此在这个示例中演示了多线程间的同步。

示例2:队列大小和剩余空间的获取

import java.util.concurrent.ArrayBlockingQueue;

public class QueueSizeDemo {
    public static void main(String[] args) {
        ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10, true);
        for (int i = 1; i <= 5; i++) {
            queue.add(i); //添加元素
        }
        System.out.println("队列大小:" + queue.size()); //输出队列大小
        System.out.println("队列中剩余空间:" + queue.remainingCapacity()); //输出队列中未被填满的剩余空间
    }
}

在该示例中,先向队列中添加了5个元素,然后通过sizeremainingCapacity分别获取了队列的大小和剩余空间。因为队列的容量是10,而已经添加了5个元素,因此队列中剩余的空间还有5个。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java concurrency集合之ArrayBlockingQueue_动力节点Java学院整理 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Java面向对象选择题总结归纳

    Java面向对象选择题总结归纳 1. 答题技巧 在 Java 面向对象的选择题中,需要重点关注四个方面: 继承 多态 接口 抽象类 在做选择题时,需要结合这四个方面来推断代码的输出结果,而且需要结合实际情况进行分析,不能片面理解。 2. 继承 Java 中可以通过继承实现类的复用。在做选择题时,需要注意以下几点: 子类继承了父类的所有方法和属性,但是并不会继…

    Java 2023年5月26日
    00
  • Spring boot整合Mybatis实现级联一对多CRUD操作的完整步骤

    下面是“Spring boot整合Mybatis实现级联一对多CRUD操作的完整步骤”的攻略。 一、准备工作 首先,需要搭建好Spring Boot项目,并将Mybatis集成到项目中。可以参考官方文档。然后,需要确保数据库中有两张表,一张父表和一张子表。例如,下面是一个父表和一个子表的示例: 父表 student: | id | name | | —-…

    Java 2023年5月20日
    00
  • 必须要学会的JMM与volatile

    下面我为你详细讲解必须要学会的JMM与volatile的完整攻略。 JMM介绍 JMM(Java Memory Model)即Java内存模型,用于规范Java程序中线程对共享变量的操作。JMM为Java程序中的线程提供可见性、有序性、原子性等保证,从而提高程序并发性能。 JMM提供的保证 可见性: 一个线程修改了共享变量的值,这个值的变化对其他线程是可见的…

    Java 2023年5月26日
    00
  • JAVA基于数组实现的商品信息查询功能示例

    JAVA基于数组实现的商品信息查询功能示例攻略 简介 在JAVA程序设计中,我们常常需要对一些数据进行操作和查询。本文将介绍如何使用数组来实现一款基于商品信息的查询功能的示例程序。 实现步骤 定义商品信息数据模型 我们根据商品信息的结构,定义一个商品信息的类Product,包含name、price和stock等属性。对应代码如下: public class …

    Java 2023年5月26日
    00
  • Java中string和int的互相转换问题

    在Java中,String和int之间的转换是比较常见的操作,下面是完整的攻略: String转int 要将String类型的变量转化为int,有以下两种方法: 1. Integer.parseInt()方法 通过Integer类提供的parseInt()方法可以将String类型的变量转化为int。示例如下: String a = "123&qu…

    Java 2023年5月27日
    00
  • JSP技术实现RSS订阅功能的示例

    下面是实现JSP技术实现RSS订阅功能的完整攻略: 简介 利用JSP技术实现RSS订阅功能的主要思路是创建一个JavaBean来处理RSS文件,然后在JSP页面中调用该JavaBean来显示RSS内容。这种方式能够很好地分离业务逻辑和视图,增加代码的可维护性。 实现步骤 定义RSS数据结构 首先需要定义RSS数据结构,包括RSS频道、RSS条目等。常用的RS…

    Java 2023年6月15日
    00
  • CentOS安装solr 4.10.3详细教程

    CentOS安装solr 4.10.3详细教程 简介 Solr是一个开源的全文搜索引擎,使用Java编写,基于Apache Lucene构建。Solr可以用作独立的全文搜索服务器,也可以与其他应用程序集成。 本文将提供在CentOS上安装Solr 4.10.3的完整教程。 步骤 步骤1:安装Java 由于Solr是使用Java编写的,因此必须先安装Java。…

    Java 2023年6月2日
    00
  • apache简介_动力节点Java学院整理

    Apache简介——动力节点Java学院整理 什么是Apache Apache是一种开源的、跨平台的Web服务器软件。它最初由美国国家超级电脑应用中心(NCSA)开发,随后成为了Apache软件基金会的一项开源软件项目。它可以运行在几乎所有包括Windows、Linux、Unix、MacOS在内的操作系统上。目前,Apache已成为世界上最流行的Web服务器…

    Java 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部