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

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日

相关文章

  • 在IDEA的maven项目中连接并使用MySQL8.0的方法教程

    以下是在IDEA的maven项目中连接并使用MySQL8.0的方法教程的完整攻略: 步骤一:安装并配置MySQL 确认已安装MySQL 8.0或以上版本,并启动MySQL服务。 使用命令行或可视化工具如Navicat等创建一个数据库,例如“testdb”。 创建一个数据库用户,并授予该用户对“testdb”数据库的全部权限。 步骤二:添加Maven依赖 按照…

    Java 2023年6月16日
    00
  • 基于Ajax技术实现考试倒计时并自动提交试卷

    实现基于Ajax技术的考试倒计时并自动提交试卷,主要分为以下几个步骤: 前端设计:基于HTML、CSS和JavaScript实现考试页面的布局和倒计时功能,并设置提交试卷的按钮。 示例代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g…

    Java 2023年6月15日
    00
  • JSP上传文件到指定位置实例代码

    下面我将详细讲解“JSP上传文件到指定位置实例代码”的完整攻略: 标题 JSP上传文件到指定位置实例代码 代码实现步骤 首先在 JSP 页面中使用 input 标签设置一个文件上传表单: <form action="upload.jsp" method="post" enctype="multipart…

    Java 2023年6月15日
    00
  • 关于Struts2文件上传与自定义拦截器

    关于Struts2文件上传与自定义拦截器的完整攻略 文件上传 环境配置 在使用Struts2进行文件上传之前,需要进行相关的环境配置。首先需要在struts.xml文件中配置org.apache.struts2.dispatcher.multipart.MultiPartRequest类型的解析器: <constant name="strut…

    Java 2023年5月20日
    00
  • Java中的ConcurrentModificationException是什么?

    Java中的ConcurrentModificationException是一种运行时异常,它表示在使用迭代器(Iterator)遍历集合(例如List、Set、Map等)时,针对集合的某些操作导致了集合的结构发生了修改,从而导致迭代器状态不一致的异常。 具体来说,如果在使用迭代器遍历集合时,另外一个线程改变了集合的结构(比如添加、删除元素等),那么正在遍历…

    Java 2023年4月27日
    00
  • 解析MyBatis源码实现自定义持久层框架

    解析MyBatis源码实现自定义持久层框架是一个比较高级的主题,需要我们对MyBatis的原理和实现方式有一定的了解,下面是一个完整攻略: 1. 理解MyBatis的框架结构 MyBatis的框架结构有三个方面: SqlSessionFactoryBuilder:用于创建SqlSessionFactory对象,可以从XML配置文件和Java代码两种方式创建。…

    Java 2023年6月15日
    00
  • MyBatis注解实现动态SQL问题

    下面是针对”MyBatis注解实现动态SQL问题”的完整攻略: 动态SQL语句的背景: 在进行数据库操作时,我们经常会用到动态SQL语句,而MyBatis也提供了多种方式来实现动态SQL,比如XML方式等,但是本文主要讲解注解实现动态SQL的问题。注解方式的实现相比XML更加简洁,可读性更强。在注解方式中,我们可以使用MyBatis提供的@SelectPro…

    Java 2023年5月20日
    00
  • spring security与corsFilter冲突的解决方案

    对于Spring Security和CORS(跨来源资源共享)Filter的异军突起,可能是由于两者在处理跨域请求的方式不同而导致的。Spring Security需要进行身份验证和授权,而CORS Filter是一个基于Web的安全工具,它帮助Web应用程序实现跨域请求。这两者之间的冲突可能会导致无法登录或提供受限制的访问。 下面是解决此问题的步骤: 1.…

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