当前位置: 首页 > article >正文

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

在 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.kler.cn/a/610760.html

相关文章:

  • LIMS应用的意义-LIMS厂家排名推荐
  • 全分辨率免ROOT懒人精灵-自动化编程思维-设计思路-实战训练
  • Docker镜像迁移方案
  • Rust从入门到精通之入门篇:3.Hello World
  • [问题收集]mysql主从分离过程中,数据不同步可能导致的后果以及应对策略
  • Ubuntu 重置密码方法
  • Android studio无法查看源码
  • 2.4 Gannt图【甘特图】
  • 多级缓存和数据一致性问题
  • 鸿蒙Flutter开发故事:不,你不需要鸿蒙化
  • 宝塔docker flarum默认登录账号密码,crazymax/flarum镜像默认登录账号密码
  • 【leetcode hot 100 215】数组中的第K个最大元素
  • Python----计算机视觉处理(Opencv:梯度处理:filiter2D算子,Sobel,Laplacian)
  • 鸿蒙HarmonyOS NEXT之无感监听
  • WPF TextBox实现键盘enter后实时读取TextBox中的值
  • BP神经网络+NSGAII算法(保真)
  • CentOS 7 挂载与卸载文件系统
  • 《TypeScript 7天速成系列》第4天:TypeScript模块与命名空间:大型项目组织之道
  • 前端面试常见的计算机网络内容梳理
  • jeecgboot vue 分片上传 minio