Java 的 CountDownLatch 中,latch.await()的作用是什么,怎么使用的

在 Java 的 CountDownLatch 中,latch.await() 是一个关键方法,它的作用是让当前线程等待,直到 CountDownLatch 的计数器(count)变为 0。如果计数器已经为 0,则调用 await() 的线程会立即返回,不会阻塞。

核心原理
• 阻塞等待:当调用 await() 时,当前线程会进入阻塞状态,直到 CountDownLatch 的计数器被其他线程通过 countDown() 方法减少到 0。
• 非阻塞情况:如果计数器已经为 0,则 await() 立即返回,线程不会阻塞。

代码示例

import java.util.concurrent.CountDownLatch;

public class LatchExample {
    public static void main(String[] args) {
        // 初始化 CountDownLatch,初始计数为 1(表示等待 B 线程完成)
        CountDownLatch latch = new CountDownLatch(1);

        // 创建 B 线程(生产者)
        Thread B = new Thread(() -> {
            System.out.println("B 线程正在执行...");
            // 模拟耗时操作
            try { Thread.sleep(2000); } catch (InterruptedException e) {}
            System.out.println("B 线程执行完毕,触发 CountDownLatch");
            latch.countDown(); // 计数器减 1 → 变为 0
        });

        // 创建 C 线程(消费者,依赖 B 的结果)
        Thread C = new Thread(() -> {
            try {
                System.out.println("C 线程开始等待 B 线程完成...");
                latch.await(); // 阻塞直到计数器为 0
                System.out.println("C 线程继续执行,B 已完成");
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                System.out.println("C 线程被中断");
            }
        });

        B.start();
        C.start();
    }
}

关键点

  1. 阻塞与唤醒:
    • C 线程调用 latch.await() 后,会立即阻塞,直到 B 线程执行 latch.countDown() 将计数器减到 0。
    • 当 countDown() 使计数器变为 0 时,所有等待的线程(如 C 线程)会被唤醒,继续执行。
  2. 线程安全:
    • CountDownLatch 是线程安全的,多个线程可以同时调用 countDown() 和 await()。
  3. 异常处理:
    • await() 可能抛出 InterruptedException,表示线程在等待时被中断。需要捕获异常或声明抛出。
  4. 应用场景:
    • 当某个线程需要等待一个或多个线程完成任务后才能继续执行时,CountDownLatch 是常用工具。例如:
    • 等待所有数据加载完成后再启动业务逻辑。
    • 等待某个初始化任务完成后执行后续操作。

与 join() 的区别
• join():是 Thread 类的方法,用于等待单个线程执行完毕。例如 B.join() 表示等待 B 线程完成。
• CountDownLatch:更灵活,可以等待多个线程(通过调整初始计数),且支持更复杂的控制逻辑(例如多个线程协作完成任务)。

注意事项
• CountDownLatch 是一次性的,计数器只能从初始值递减到 0,无法重新设置。
• 如果需要可重置的计数器,可以考虑使用 CyclicBarrier。
通过 latch.await(),可以轻松实现线程间的依赖关系,确保 C 线程在 B 线程完成后再执行。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值