0

0

Java中高效构建与管理同步的BlockingQueue列表

DDD

DDD

发布时间:2025-10-13 10:27:11

|

963人浏览过

|

来源于php中文网

原创

java中高效构建与管理同步的blockingqueue列表

本文将深入探讨在Java中如何正确构建一个包含多个`BlockingQueue`实例的同步列表。我们将澄清`ArrayList`构造函数中容量参数的常见误解,并提供两种实用的方法:利用Java Stream API结合`collectingAndThen`进行函数式构建,以及使用传统的`for`循环迭代添加元素。这两种方法都能确保生成一个线程安全的、预填充了指定数量`BlockingQueue`的列表,适用于并发编程场景。

在Java并发编程中,我们经常需要处理线程安全的数据结构。一个常见的需求是创建一个包含多个BlockingQueue实例的列表,并确保这个列表本身也是线程安全的。然而,在尝试初始化这样的数据结构时,开发者可能会遇到一些常见的误解。

理解ArrayList的容量与大小

许多开发者在初始化ArrayList时,可能会使用带容量参数的构造函数,例如 new ArrayList(15),并期望这会创建一个包含15个空元素的列表。但实际上,这个构造函数仅仅是为ArrayList的底层数组预分配了内存空间,以优化后续的元素添加操作,而不会改变列表的实际大小(size)。这意味着,new ArrayList(15)创建的列表其size()仍然是0,因为它不包含任何元素。

要构建一个包含特定数量BlockingQueue实例的列表,我们需要显式地向列表中添加这些队列对象。此外,BlockingQueue是一个接口,需要选择其具体实现,例如ArrayBlockingQueue。ArrayBlockingQueue在其构造函数中也需要指定一个容量,这代表了该队列能够存储的最大元素数量。

立即学习Java免费学习笔记(深入)”;

接下来,我们将介绍两种有效的方法来构建一个同步的、预填充了BlockingQueue实例的列表。

e网企业2.0
e网企业2.0

一款适用于中小企业自助建站程序,是c#与xml技术相结合的产物,支持动态设定二级栏目,采用了开放式架构,建站模版自由添加。程序整合了(单一文本,新闻列表,图片列表 ,在线订单, 文件下载 , 留言板)六类插件,以所见即所得的方式,将烦锁的建站过程简化到三步,使用户可以轻松上手。 管理后台:manage.aspx 初始密码均为admin

下载

方法一:使用Java Stream API和collectingAndThen

Java 8引入的Stream API提供了一种声明式、函数式的方法来处理集合数据。结合Collectors.collectingAndThen,我们可以优雅地构建所需的同步列表。

import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.Collections;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class SynchronizedBlockingQueueListGenerator {

    public static void main(String[] args) {
        final int queueCapacity = 10; // 每个BlockingQueue的容量
        final int numberOfQueues = 5; // 列表中BlockingQueue的数量

        // 使用Stream API生成并同步列表
        List> listOfQueues =
            Stream.generate(() -> new ArrayBlockingQueue(queueCapacity))
                  .limit(numberOfQueues)
                  .collect(Collectors.collectingAndThen(
                      Collectors.toList(),
                      Collections::synchronizedList
                  ));

        System.out.println("Stream API生成的列表大小: " + listOfQueues.size());
        // 验证列表中的队列是否可操作
        listOfQueues.forEach(queue -> {
            System.out.println("队列容量: " + ((ArrayBlockingQueue)queue).remainingCapacity());
            try {
                queue.put(new AtomicInteger(1));
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });
    }
}

代码解析:

  1. Stream.generate(() -> new ArrayBlockingQueue(queueCapacity)): 创建一个无限流,每次调用都生成一个新的ArrayBlockingQueue实例。每个ArrayBlockingQueue都被初始化为指定的queueCapacity。
  2. .limit(numberOfQueues): 将无限流截断,使其只生成指定数量的BlockingQueue实例。
  3. .collect(Collectors.collectingAndThen(Collectors.toList(), Collections::synchronizedList)): 这是关键一步。
    • Collectors.toList():首先将流中的所有BlockingQueue实例收集到一个标准的ArrayList中。
    • Collections::synchronizedList:然后,collectingAndThen会接收这个ArrayList,并对其应用Collections.synchronizedList方法,返回一个线程安全的列表视图。

方法二:使用传统的for循环

对于不熟悉Stream API的开发者,或者在简单场景下,使用传统的for循环迭代添加元素也是一个清晰直观的选择。

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.Collections;

public class SynchronizedBlockingQueueListGeneratorTraditional {

    public static void main(String[] args) {
        final int queueCapacity = 10; // 每个BlockingQueue的容量
        final int numberOfQueues = 5; // 列表中BlockingQueue的数量

        // 使用for循环生成列表
        List> tempListOfQueues = new ArrayList<>();
        for (int i = 0; i < numberOfQueues; i++) {
            tempListOfQueues.add(new ArrayBlockingQueue<>(queueCapacity));
        }

        // 将生成的列表包装成同步列表
        List> synchronizedListOfQueues =
            Collections.synchronizedList(tempListOfQueues);

        System.out.println("for循环生成的列表大小: " + synchronizedListOfQueues.size());
        // 验证列表中的队列是否可操作
        synchronizedListOfQueues.forEach(queue -> {
            System.out.println("队列容量: " + ((ArrayBlockingQueue)queue).remainingCapacity());
            try {
                queue.put(new AtomicInteger(2));
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });
    }
}

代码解析:

  1. List> tempListOfQueues = new ArrayList();: 首先创建一个普通的ArrayList来存储ArrayBlockingQueue实例。
  2. for (int i = 0; i (queueCapacity)); }: 通过循环,按照指定的数量创建ArrayBlockingQueue实例,并逐一添加到tempListOfQueues中。
  3. List> synchronizedListOfQueues = Collections.synchronizedList(tempListOfQueues);: 在所有队列都添加到tempListOfQueues之后,使用Collections.synchronizedList方法将其包装成一个线程安全的列表视图。

注意事项与最佳实践

  1. 同步范围: Collections.synchronizedList()方法只确保了对列表结构(如添加、删除元素,或者获取迭代器)的并发访问是线程安全的。它会自动同步列表中每个BlockingQueue实例内部的操作(如put()、take())。BlockingQueue的实现(如ArrayBlockingQueue)本身就是线程安全的,因此对其元素的并发操作无需额外同步。
  2. BlockingQueue容量: ArrayBlockingQueue是一个有界队列,其构造函数必须指定容量。请根据实际需求合理设置这个容量,因为它决定了队列能够存储的最大元素数量。
  3. 泛型类型: 在示例中,我们使用了BlockingQueue。AtomicInteger是Java并发包提供的一个原子类,用于在多线程环境下安全地操作整数,避免了手动同步。如果队列中存储的是其他类型的对象,且这些对象本身不是线程安全的,那么在访问这些对象时可能需要额外的同步措施。
  4. 选择合适的BlockingQueue实现: 除了ArrayBlockingQueue,Java还提供了LinkedBlockingQueue(链表实现,默认无界或可指定容量)、PriorityBlockingQueue(优先级队列)、DelayQueue(延迟队列)等。根据应用场景选择最适合的BlockingQueue实现。

总结

正确构建一个包含多个BlockingQueue实例的同步列表,关键在于理解ArrayList的容量与大小的区别,并显式地填充列表。无论是采用现代的Stream API结合collectingAndThen的函数式方法,还是传统的for循环迭代方法,都能有效地实现这一目标。最终生成的同步列表将为并发应用程序提供一个稳定且线程安全的基础结构,但请务必记住Collections.synchronizedList的同步范围限制,并结合BlockingQueue自身的线程安全特性进行编程。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

832

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

737

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

734

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16925

2023.08.03

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.5万人学习

C# 教程
C# 教程

共94课时 | 6.7万人学习

Java 教程
Java 教程

共578课时 | 45.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号