Java并发工具类:从CountDownLatch到CyclicBarrier的实战应用

  Java   6分钟   515浏览   0评论

你好呀,我是小邹。

引言

在复杂的并发系统设计中,有效地协调多个线程的执行顺序和同步点是至关重要的。Java并发包(java.util.concurrent)为我们提供了丰富的工具类来简化这一过程,其中CountDownLatchCyclicBarrier尤为突出,它们各自以独特的方式控制线程的执行流程。本文将深入解析这两个工具类的原理、使用场景,并通过实际代码示例展示其强大功能。

1. CountDownLatch:倒计时协调器

CountDownLatch是一个灵活的同步辅助类,它允许一个或多个线程等待其他线程完成一系列操作后再继续执行。这个类就像是一个计数器,初始化时设置一个计数值,每次调用countDown()方法,计数减一。当计数到达零时,所有等待在await()方法上的线程被释放并继续执行。

代码示例:

import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {
    public static void main(String[] args) throws InterruptedException {
        // 初始化CountDownLatch,计数值为3
        CountDownLatch latch = new CountDownLatch(3);

        // 创建三个任务线程
        Thread thread1 = new Thread(() -> {
            System.out.println("Task 1 started.");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Task 1 finished.");
            // 任务完成后计数减一
            latch.countDown();
        });

        // 同理创建thread2和thread3

        // 启动所有任务
        thread1.start();
        // thread2.start();
        // thread3.start();

        // 主线程等待所有任务完成
        latch.await();
        System.out.println("All tasks completed.");
    }
}

2. CyclicBarrier:循环屏障

CountDownLatch不同,CyclicBarrier更侧重于让一组线程相互等待,直到所有线程都到达某个屏障点后再一起继续执行。关键在于它是可重用的,即屏障点可以被重置并重复使用,非常适合多轮处理任务的场景。

代码示例:

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierExample {
    public static void main(String[] args) {
        int parties = 3; // 需要等待的线程数量
        CyclicBarrier barrier = new CyclicBarrier(parties, () -> System.out.println("All threads reached the barrier and continuing..."));

        for (int i = 0; i < parties; i++) {
            Thread thread = new Thread(() -> {
                try {
                    System.out.println(Thread.currentThread().getName() + " is waiting on barrier.");
                    barrier.await(); // 等待所有线程到达屏障
                    System.out.println(Thread.currentThread().getName() + " continued after barrier.");
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }, "Thread-" + (i + 1));
            thread.start();
        }
    }
}

结论

通过上述分析与代码示例,我们可以看到CountDownLatchCyclicBarrier虽有相似之处,但设计理念和应用场景大相径庭。CountDownLatch适用于控制线程等待特定数量的任务完成,而CyclicBarrier则强调一组线程间的同步点,便于进行多阶段处理。掌握这些并发工具类,能显著提升Java应用在并发环境下的执行效率与可靠性,是构建高性能系统不可或缺的一部分。

如果你觉得文章对你有帮助,那就请作者喝杯咖啡吧☕
微信
支付宝
  0 条评论