java集合框架 arrayblockingqueue应用分析

Java集合框架ArrayBlockingQueue应用分析

一、ArrayBlockingQueue介绍

ArrayBlockingQueue是Java集合框架中的一种阻塞队列,它是线程安全的有限队列,底层是使用数组实现的,它具有FIFO(先进先出)的特性,支持高效的并发访问。ArrayBlockingQueue是一种固定长度的队列,当队列已满时,会阻塞插入元素的线程,当队列已空时,会阻塞获取元素的线程,保证线程安全。

ArrayBlockingQueue的构造方法如下:

public ArrayBlockingQueue(int capacity, boolean fair);

其中,capacity为队列容量,fair为是否保证公平性,即使用先进先出的方式获取元素。

ArrayBlockingQueue的常用方法:

  • put(E e):将元素插入队尾(如果队列已满则阻塞)
  • take():获取队头元素(如果队列已空则阻塞)
  • offer(E e, long timeout, TimeUnit unit):在指定时间内尝试将元素插入队尾
  • poll(long timeout, TimeUnit unit):在指定时间内尝试获取队头元素
  • size():获取队列元素个数

二、示例说明

1. 生产者和消费者模型

ArrayBlockingQueue通常应用于生产者和消费者模型,其中生产者不断地往队列中添加元素,消费者从队列中获取元素并进行处理。

下面是一个简单的示例代码:

import java.util.concurrent.ArrayBlockingQueue;

public class ProducerConsumerExample {

    public static void main(String[] args) {

        ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(10);

        // 生产者线程
        Thread producerThread = new Thread(() -> {
            int count = 0;
            while (true) {
                try {
                    String message = "Message " + count++;
                    queue.put(message);
                    System.out.println("Produced: " + message);
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        producerThread.start();

        // 消费者线程
        Thread consumerThread = new Thread(() -> {
            while (true) {
                try {
                    String message = queue.take();
                    System.out.println("Consumed: " + message);
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        consumerThread.start();
    }
}

该示例中,生产者线程往队列中添加了10个元素,然后就一直在队列已满时阻塞等待;消费者线程从队列中获取元素并输出,然后就一直在队列已空时阻塞等待。

2. 多生产者和多消费者模型

ArrayBlockingQueue还可以应用于多生产者和多消费者模型,其中多个生产者不断地往队列中添加元素,多个消费者从队列中获取元素并进行处理。

下面是一个简单的示例代码:

import java.util.concurrent.ArrayBlockingQueue;

public class MultiProducerConsumerExample {

    public static void main(String[] args) {

        // 创建一个容量为10的队列
        ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);

        // 创建2个生产者线程
        Thread producerThread1 = new Thread(() -> {
            int count = 0;
            while (true) {
                try {
                    queue.put(count);
                    System.out.println(Thread.currentThread().getName() + " produced: " + count++);
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "Producer 1");
        producerThread1.start();

        Thread producerThread2 = new Thread(() -> {
            int count = 0;
            while (true) {
                try {
                    queue.put(count);
                    System.out.println(Thread.currentThread().getName() + " produced: " + count++);
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "Producer 2");
        producerThread2.start();

        // 创建3个消费者线程
        Thread consumerThread1 = new Thread(() -> {
            while (true) {
                try {
                    int value = queue.take();
                    System.out.println(Thread.currentThread().getName() + " consumed: " + value);
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "Consumer 1");
        consumerThread1.start();

        Thread consumerThread2 = new Thread(() -> {
            while (true) {
                try {
                    int value = queue.take();
                    System.out.println(Thread.currentThread().getName() + " consumed: " + value);
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "Consumer 2");
        consumerThread2.start();

        Thread consumerThread3 = new Thread(() -> {
            while (true) {
                try {
                    int value = queue.take();
                    System.out.println(Thread.currentThread().getName() + " consumed: " + value);
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "Consumer 3");
        consumerThread3.start();
    }
}

该示例中,创建了2个生产者线程和3个消费者线程,它们不断地往队列中添加元素和从队列中获取元素,并进行输出。当队列已满或已空时,线程会自动阻塞等待。

三、总结

ArrayBlockingQueue是一个非常有用的并发集合,通常应用于生产者和消费者模型以及多生产者和多消费者模型等场景下。通过合理地使用ArrayBlockingQueue,我们可以避免线程安全问题,实现高效的并发访问。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java集合框架 arrayblockingqueue应用分析 - Python技术站

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

相关文章

  • 基于Java protected的深入理解

    基于Java protected的深入理解 在Java中,protected是一种访问修饰符,它的作用是控制类的成员变量和成员方法的访问范围。在本文中,我们将探讨protected修饰符的具体用法和相关知识点。 protected修饰符的作用 protected修饰符可以使得一个类的成员变量和成员方法在该类的子类和同一包中的其他类中访问。同时,它也可以保证该…

    Java 2023年5月26日
    00
  • 一篇文章让你弄懂Java运算符

    一篇文章让你弄懂 Java 运算符 作为一名 Java 开发者,运算符是我们经常要用到的基本语法。在这篇文章中,我将详细讲解 Java 运算符,包括算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符等。 算术运算符 Java 中包含了常见的算术运算符,如加法、减法、乘法、除法和取模(求余数)。我们可以通过一个简单的例子来理解这些运算符的使用: int …

    Java 2023年5月23日
    00
  • Java多线程编程实战之模拟大量数据同步

    Java多线程编程实战之模拟大量数据同步 问题描述 在实际的应用场景中,经常遇到需要将大量数据进行同步的情况,这时候使用单线程去同步数据,效率非常低下,因此需要使用多线程技术来提高数据同步的效率。本篇攻略将介绍如何使用Java多线程技术来模拟大量数据同步的场景。 实现方案 多线程同步数据的基本思路 在多线程同步数据的场景中,我们可以通过开启多个线程,每个线程…

    Java 2023年5月18日
    00
  • 一篇文章带你了解Java Spring基础与IOC

    一篇文章带你了解Java Spring基础与IOC 什么是Java Spring? Java Spring是一个轻量级的开源Java框架,它被广泛地应用于企业级Java应用开发中。它提供了一系列的工具和框架来帮助开发者构建易于维护和易于扩展的Web应用或企业应用。 Java Spring的核心特点包括: 依赖注入(DI)和控制反转(IoC)模式 面向切面编程…

    Java 2023年5月19日
    00
  • Spring Data JPA踩坑记录(@id @GeneratedValue)

    Spring Data JPA踩坑记录(@id @GeneratedValue) 问题描述 在使用Spring Data JPA进行开发时,当使用 @Id 和 @GeneratedValue 注解来配置主键时,如果没有正确设置主键生成策略,就有可能会遇到一些奇怪的问题。 问题原因 在JPA规范中,对于主键生成策略,可以通过 @GeneratedValue注解…

    Java 2023年6月2日
    00
  • 详解Java中的do…while循环语句的使用方法

    详解Java中的do…while循环语句的使用方法 在Java中,do…while循环语句是常用的一种循环控制结构,用于在特定条件成立时重复执行某段代码,直到循环条件不再成立。 do…while循环语句的语法格式 do { // 待执行的代码块 } while (条件表达式); 其中,条件表达式可以是任何可以被转换为布尔类型的表达式,只有在该表达…

    Java 2023年5月26日
    00
  • Tomcat安装配置及Eclipse配置详解

    Tomcat安装配置及Eclipse配置详解 Tomcat是一个Java Servlet容器,可运行Java的Web应用程序。本文将讲解如何在Windows系统中安装和配置Tomcat,并在Eclipse中建立与Tomcat的关联。 安装Tomcat 前往官方网站(http://tomcat.apache.org/)下载最新的Tomcat程序,选择与操作系统…

    Java 2023年5月19日
    00
  • 实例讲解JSP Model2体系结构(下)

    “实例讲解JSP Model2体系结构(下)”是一篇介绍JSP Model2体系结构的文章,其中涉及了该体系结构的设计思想、实现方法以及使用场景等方面的内容。本文将对该篇文章进行详细的讲解,具体包括以下几个部分: 1. 文章结构 该篇文章分为四个部分,分别是: JSP Model2体系结构概述 JSP Model2实例详解 JSP Model2的优缺点 总结…

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