Java CyclicBarrier和CountDownLatch的区别

简介: Java CyclicBarrier和CountDownLatch的区别

Java CyclicBarrier和CountDownLatch的区别

在Java中,CyclicBarrier和CountDownLatch是用于多线程协作的工具类,它们都可以用于线程间的同步和等待,但在使用方式和场景上有一些区别。

CyclicBarrier(循环屏障):

  • CyclicBarrier用于让多个线程相互等待,直到达到某个公共的屏障点,然后同时开始执行下一阶段的任务。
  • CyclicBarrier可以重复使用,当所有线程都到达屏障点时,屏障会打开,所有线程可以继续执行后续任务。
  • CyclicBarrier适用于任务分阶段执行的场景,要求多个线程在同一时间点相互等待,并且可以同时开始下一阶段的任务。

代码示例:

CyclicBarrier barrier = new CyclicBarrier(3, () -> {
    // 当所有线程都到达屏障点时执行的任务
    System.out.println("All threads reached the barrier");
});

// 线程1
new Thread(() -> {
    // 线程1的任务
    try {
        Thread.sleep(1000);
        System.out.println("Thread 1 finished");
        barrier.await(); // 等待其他线程到达屏障点
    } catch (InterruptedException | BrokenBarrierException e) {
        e.printStackTrace();
    }
}).start();

// 线程2和线程3类似

// 输出:
// Thread 1 finished
// Thread 2 finished
// Thread 3 finished
// All threads reached the barrier

CountDownLatch(倒计时门闩):

  • CountDownLatch用于实现一个或多个线程等待其他线程执行完毕的场景。
  • CountDownLatch初始化一个计数器,每个线程执行完任务后将计数器减一,等待的线程调用await()方法等待计数器为零时继续执行。
  • CountDownLatch一旦计数器为零,无法重置,所有等待的线程将同时被释放。

代码示例:

CountDownLatch latch = new CountDownLatch(3);

// 线程1
new Thread(() -> {
    // 线程1的任务
    System.out.println("Thread 1 finished");
    latch.countDown(); // 计数器减一
}).start();

// 线程2和线程3类似

try {
    latch.await(); // 等待计数器为零
    System.out.println("All threads finished");
} catch (InterruptedException e) {
    e.printStackTrace();
}

// 输出:
// Thread 1 finished
// Thread 2 finished
// Thread 3 finished
// All threads finished

CyclicBarrier和CountDownLatch的区别:

  • CyclicBarrier适合线程间等待彼此达到屏障点,然后同时开始下一阶段的任务,可以重复使用。而CountDownLatch适合一个或多个线程等待其他线程执行完毕后再继续执行,计数器无法重置。
  • CyclicBarrier更适合多阶段任务的协作,而CountDownLatch更适合某个任务的前置准备或者等待多个任务同时完成的场景。

根据具体的业务需求和协作场景,选择合适的同步工具类可以提高程序的可读性和可维护性。

相关文章
|
2天前
|
并行计算 Java 调度
深入理解Java并发工具包中的CyclicBarrier
深入理解Java并发工具包中的CyclicBarrier
|
2天前
|
存储 安全 搜索推荐
深入剖析Java中的CountDownLatch:同步协作的利器
深入剖析Java中的CountDownLatch:同步协作的利器
|
7天前
|
Java
Java中Comparable接口和Comparator接口的区别(如果想知道Java中Comparable接口和Comparator接口的区别,那么只看这一篇就足够了!)
Java中Comparable接口和Comparator接口的区别(如果想知道Java中Comparable接口和Comparator接口的区别,那么只看这一篇就足够了!)
|
16天前
|
API
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
14 1
|
1天前
|
Java
Java中代码块区别及代码示例
Java中代码块区别及代码示例
|
2天前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
【6月更文挑战第26天】Java IO流涵盖字节流与字符流。字节流(InputStream/OutputStream)处理数据单位为字节,适用于二进制和文本,而字符流(Reader/Writer)专注于文本,处理单位为字符,处理编码转换。字符流在字节流基础上添加编码处理,以装饰器模式实现。文件复制示例展示了两者区别:字节流直接复制所有数据,字符流处理字符编码。理解并选择适当流类型对优化程序至关重要。
|
3天前
|
算法 Java 机器人
Java中的异常处理:Checked与Unchecked的区别
Java中的异常处理:Checked与Unchecked的区别
|
3天前
|
Java
【逻辑运算符】在Java中 &&和&的区别 ||和|的区别
【逻辑运算符】在Java中 &&和&的区别 ||和|的区别
4 0
|
4天前
|
Java
java使用CountDownLatch将一个任务拆解后合并处理
java使用CountDownLatch将一个任务拆解后合并处理
5 0
|
11天前
|
Java
Java编程不再难:一文看懂抽象类与接口的区别和联系!
【6月更文挑战第17天】在Java OOP中,抽象类与接口助你构建复杂应用。以图书管理系统为例,抽象类`Book`作为基类提供共享属性和方法,不直接实例化。接口如`HasChapters`和`HasIssues`定义特殊行为。抽象类支持部分实现,单继承,适合共享行为;接口仅含常量和抽象方法,多实现,强调行为规范。通过继承和实现,实现代码复用和系统扩展性。理解两者异同,是提升Java编程能力的关键。