Java 多线程 - 12 - Java 并发工具类 CountDownLatch

概述

CountDownLatch 是 JAVA 提供在 java.util.concurrent 包下的一个辅助类,可以把它看成是一个计数器,其内部维护着一个 count 计数,只不过对这个计数器的操作都是原子操作,同时只能有一个线程去操作这个计数器,CountDownLatch 通过构造函数传入一个初始计数值,调用者可以通过调用 CounDownLatch 对象的 countDown() 方法,来使计数减 1 ;如果调用对象上的 await() 方法,那么调用者就会一直阻塞在这里,直到别人通过 countDown() 方法,将计数减到 0 ,才可以继续执行。

API

# 调用 await 线程会被挂起,直到 count 计数值为 0 才继续执行
public void await() throws InterruptedException {} 

# 和 await() 类似,只不过当等待时间后如果 count 还没变为0就继续执行。
public boolean await(long timeout, TimeUnit unit)throws InterruptedException {}

# count 计数值减一
public void countDown() {    }

使用

  • 确保某个计算在其需要的所有资源都被初始化之后才继续执行。
  • 确保某个服务在其依赖的所有其他服务都已启动后才启动。
  • 等待知道某个操作的所有者都就绪在继续执行。
public class CountDownLatchTest {
    private static CountDownLatch countDownLatch = null;
    private static final int THREAD_NUMBER = 3;

    public static void main(String[] args) {
        countDownLatch = new CountDownLatch(THREAD_NUMBER);
        //线程池
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(THREAD_NUMBER);
        //执行线程
        fixedThreadPool.execute(new CustomRunnable("test 1"));
        fixedThreadPool.execute(new CustomRunnable("test 2"));
        fixedThreadPool.execute(new CustomRunnable("test 3"));
        System.out.println("等待3个子线程执行完毕...");
        try {
            countDownLatch.await();
            System.out.println("子线程已经执行完毕继续执行主线程");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private static class CustomRunnable implements Runnable {

        public void run() {
            try {
                Thread.sleep(1000);
                countDownLatch.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老高的IT职业路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值