Golang 的 Waitgroup 锁用 Java的话要怎么实现?

embedded/2025/3/31 3:59:52/

在 Go 语言里,sync.WaitGroup 主要用于等待一组 goroutine 完成执行。在 Java 中,与之功能对应的实现方式有多种,下面为你详细介绍。

方式一:使用 CountDownLatch

CountDownLatch 是 Java 并发包 java.util.concurrent 里的一个同步工具类,它允许一个或多个线程等待其他线程完成操作。以下是示例代码:

java

import java.util.concurrent.CountDownLatch;public class CountDownLatchExample {public static void main(String[] args) throws InterruptedException {int numThreads = 3;CountDownLatch latch = new CountDownLatch(numThreads);for (int i = 0; i < numThreads; i++) {final int threadId = i;new Thread(() -> {try {System.out.println("Thread " + threadId + " is working.");// 模拟工作Thread.sleep(1000); System.out.println("Thread " + threadId + " has finished.");} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {// 减少计数latch.countDown(); }}).start();}// 等待所有线程完成latch.await(); System.out.println("All threads have finished their work.");}
}

上述代码里,CountDownLatch 初始计数为 numThreads,也就是线程的数量。每个线程完成工作后,会调用 countDown() 方法使计数减 1。主线程调用 await() 方法,会一直阻塞直到计数变为 0,这意味着所有线程都完成了工作。

方式二:使用 CyclicBarrier

CyclicBarrier 同样是 java.util.concurrent 包中的同步工具类,它能让一组线程在到达某个屏障(同步点)时相互等待。以下是示例代码:

java

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;public class CyclicBarrierExample {public static void main(String[] args) {int numThreads = 3;CyclicBarrier barrier = new CyclicBarrier(numThreads, () -> {System.out.println("All threads have reached the barrier.");});for (int i = 0; i < numThreads; i++) {final int threadId = i;new Thread(() -> {try {System.out.println("Thread " + threadId + " is working.");// 模拟工作Thread.sleep(1000); System.out.println("Thread " + threadId + " has reached the barrier.");// 等待其他线程到达屏障barrier.await(); } catch (InterruptedException | BrokenBarrierException e) {Thread.currentThread().interrupt();}}).start();}}
}

在这个例子中,CyclicBarrier 初始计数为 numThreads。每个线程完成工作后,会调用 await() 方法等待其他线程。当所有线程都调用了 await() 方法,屏障就会被打破,并且可以执行一个可选的屏障操作。

综上所述,CountDownLatch 更适合一个或多个线程等待其他线程完成操作的场景,而 CyclicBarrier 更适合一组线程相互等待到达某个同步点的场景。你可以依据具体需求选择合适的工具类。


http://www.ppmy.cn/embedded/177552.html

相关文章

2025年地理相关大学考研调剂信息汇总

以下是一些地理相关大学的考研调剂信息汇总&#xff0c;需要完整的看最下面&#xff0c;旨在为考生提供最新的调剂动态和详细的调剂指南。 考研调剂注意事项包括&#xff1a; 申请调剂前需符合招生管理规定的调剂条件。 调剂志愿至少填写一项。 考生成绩要符合教育部的初试成…

028-ImageCompress

ImageCompress 以下为针对 GIFsicle、Guetzli、LibimageQuant 的技术调研报告&#xff0c;包含原理分析、压缩率对比、代码实现及参数优化策略&#xff1a; 一、工具功能定位对比 工具名称目标格式核心场景压缩特性GIFsicleGIF动图优化/帧处理空间优化调色板量化GuetzliJPEG高…

广东省数字化补贴政策助力企业转型升级

近年来&#xff0c;广东省积极推动制造业数字化转型&#xff0c;出台了一系列数字化补贴政策&#xff0c;为企业提供有力支持。 一、龙头骨干企业数字化转型补贴 广东省聚焦工业互联网应用创新、5G全连接工厂等方向&#xff0c;支持行业龙头骨干企业建设数字化转型标杆示范项…

Elasticsearch 搜索高级

Elasticsearch 搜索高级 建议阅读顺序&#xff1a; Elasticsearch 入门Elasticsearch 搜索Elasticsearch 搜索高级&#xff08;本文&#xff09; 1. 修改文档得分 1.1 function_score 当我们利用 match 查询时&#xff0c;文档结果会根据与搜索词条的关联度打分&#xff08;_…

STM32F103_LL库+寄存器学习笔记10 - DMA传输过半+DMA传输完成中断实现DMA串口接收“双缓冲“

导言 《[[STM32F103_LL库寄存器学习笔记09 - DMA串口接收与DMA串口发送&#xff0c;串口接收空闲中断]]》上一章节完成DMA发送与接收。此时&#xff0c;有一个致命的问题可能会导致数据包丢失。原因是USART1接收只开启了接收空闲中断(IDLE)&#xff0c;DMA在连续模式下&#xf…

MySQL实战(尚硅谷)

要求 代码 # 准备数据 CREATE DATABASE IF NOT EXISTS company;USE company;CREATE TABLE IF NOT EXISTS employees(employee_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),department_id INT );DESC employees;CREATE TABLE IF NOT EXISTS departments…

光谱相机的光谱信息获取

光谱信息的获取方式主要依赖于不同分光技术和成像方法&#xff0c;将入射光分解为不同波长并记录其强度。以下是常见的光谱信息获取技术分类及原理&#xff1a; ‌1. 分光技术&#xff08;物理分解波长&#xff09;‌ ‌(1) 滤光片法‌ ‌原理‌&#xff1a;使用固定或可调滤…

《2核2G阿里云神操作!Ubuntu+Ollama低成本部署Deepseek模型实战》

简介&#xff1a; “本文为AI开发者揭秘如何在阿里云2核2G轻量级ECS服务器上&#xff0c;通过Ubuntu系统与Ollama框架实现Deepseek模型的高效部署。无需昂贵硬件&#xff0c;手把手教程涵盖环境配置、资源优化及避坑指南&#xff0c;助力初学者用极低成本在云端跑通行业领先的大…