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

相关文章

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B