java常用的并发工具类-CyclicBarrier

2024-09-04 11:20

本文主要是介绍java常用的并发工具类-CyclicBarrier,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、CyclicBarrier 的概述

CyclicBarrier 是 Java 并发包(java.util.concurrent)中的一个同步辅助类。它允许一组线程互相等待,直到所有线程都到达一个公共的屏障点(barrier)。当最后一个线程到达时,屏障就会打开,所有线程可以继续执行。CyclicBarrier 可以被反复使用,即当线程们通过屏障后,它可以被重置并再次使用。

1.1 主要构造方法

CyclicBarrier 提供了两个主要的构造方法:

  1. CyclicBarrier(int parties):创建一个新的 CyclicBarrier,指定参与者的数量(即线程数)。
  2. CyclicBarrier(int parties, Runnable barrierAction):除了指定线程数外,还可以提供一个在最后一个线程到达屏障时执行的动作(barrierAction)。
1.2 工作原理

CyclicBarrier 的工作原理非常简单。假设有 N 个线程,它们必须在某个时刻同步。你可以创建一个 CyclicBarrier,并将 N 传递给它。每个线程调用 await() 方法时,都会进入阻塞状态,直到第 N 个线程也调用了 await() 方法,此时所有线程都被释放,继续执行各自的后续操作。

二、CyclicBarrier 的使用方法

下面是 CyclicBarrier 的基本用法示例。

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;public class CyclicBarrierExample {public static void main(String[] args) {int numberOfThreads = 5;CyclicBarrier barrier = new CyclicBarrier(numberOfThreads, () -> {System.out.println("All parties have arrived at the barrier, let's proceed.");});for (int i = 0; i < numberOfThreads; i++) {new Thread(new Task(barrier)).start();}}
}class Task implements Runnable {private CyclicBarrier barrier;public Task(CyclicBarrier barrier) {this.barrier = barrier;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " is waiting at the barrier.");try {barrier.await();System.out.println(Thread.currentThread().getName() + " has crossed the barrier.");} catch (InterruptedException | BrokenBarrierException e) {e.printStackTrace();}}
}

在这个例子中,有 5 个线程需要在同一个屏障点等待。CyclicBarrier 的构造函数中传递了一个 Runnable 实例,这个实例将在所有线程到达屏障后被执行。所有线程在到达屏障后,会被阻塞,直到所有线程都调用了 await() 方法。然后,所有线程都会继续执行。

三、CyclicBarrier 的应用场景

CyclicBarrier 适用于那些需要线程协同工作的场景,例如:

3.1 多阶段任务

在多阶段任务中,每个阶段都需要多个线程同时完成。使用 CyclicBarrier,可以确保所有线程在进入下一个阶段之前都已完成当前阶段的工作。

3.2 集群计算

在分布式计算或并行处理场景下,多个线程(或节点)需要处理数据的不同部分,然后在某个时刻合并结果。这种情况下,CyclicBarrier 可以用来同步所有线程,使它们在合并数据之前完成各自的计算任务。

3.3 测试并发代码

在测试并发代码时,需要多个线程同时启动执行,以模拟高并发场景。CyclicBarrier 可以帮助实现这一点,通过让所有线程在相同点启动,从而模拟并发。

四、CyclicBarrier 与其他并发工具类的对比

4.1 CyclicBarrier vs CountDownLatch

CountDownLatch 也是一个常用的同步工具类,但与 CyclicBarrier 不同。CountDownLatch 允许一个或多个线程等待一组其他线程完成,而 CyclicBarrier 是让一组线程相互等待,直到所有线程都到达某个共同点。CountDownLatch 是一次性的,而 CyclicBarrier 是循环使用的。

4.2 CyclicBarrier vs Phaser

Phaser 是一个更复杂且灵活的同步工具类,它可以用来替代 CyclicBarrier 和 CountDownLatch。Phaser 支持动态增加或减少参与者,并且适用于更加复杂的阶段任务。CyclicBarrier 适用于简单的场景,而 Phaser 则适合处理更复杂的多阶段同步。

五、CyclicBarrier 的常见问题

  1. 线程抛出异常导致屏障失效:如果某个线程在调用 await() 方法后抛出异常,那么屏障可能会处于“破损”状态,此时所有后续调用 await() 的线程会抛出 BrokenBarrierException
  2. 屏障的重用性:每当所有线程通过屏障后,CyclicBarrier 会自动重置,并可以再次使用。这与 CountDownLatch 的一次性使用有很大的不同。
  3. 超时机制:CyclicBarrier 的 await() 方法还支持超时机制,可以指定一个最大等待时间,如果在超时时间内屏障没有被触发,线程将抛出 TimeoutException

六、总结

CyclicBarrier 是 Java 并发编程中的重要工具类,用于在多线程环境中实现线程之间的同步。它允许一组线程在一个共同点等待,直到所有线程都到达后再继续执行。CyclicBarrier 非常适合多阶段任务、集群计算和测试并发代码等场景。尽管 CyclicBarrier 在许多场景中非常有用,但在复杂的并发控制需求下,Phaser 可能会是一个更好的选择。
CyclicBarrier 是 Java 并发编程中一个非常有用的工具类,用于协调多个线程之间的同步。在并发编程中,有时需要让多个线程在执行到某个点时彼此等待,直到所有线程都到达这个点后再继续执行。这种场景下,CyclicBarrier 是一个很好的选择。

这篇关于java常用的并发工具类-CyclicBarrier的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135875

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏