JUC-CountDownLatch基础篇

JUC-AQS原理篇
JUC-AQS源码篇
JUC-AQS的Condition之await和signal源码解析

JUC-CountDownLatch基础篇
JUC-CountDownLatch源码分析
JUC-Semaphore基础篇
JUC-Semaphore源码分析
JUC-ReentrantReadWriteLock锁基础篇
JUC-ReentrantReadWriteLock锁源码分析
JUC-ReentrantLock锁基础篇
JUC-ReentrantLock锁源码分析
JUC-CyclicBarrier基础篇
JUC-CyclicBarrier源码分析

1.概念

CountDownLatch是一个同步工具类,表示允许一个或者多个线程来等待其他的线程来完成它们的操作后,才继续执行自己的操作。

CountDownLatch的作用其实很简单,其实就是一个或者一组线程在开始自己的操作时,必须先等待其他的线程操作执行完,才可以执行后面的操作。
场景举例: 比如现在有一个门,门上有5把锁,一个人想要通过这个门,必须等5把锁全部被打开,才能通过这个门继续干事情(等待线程),此时有5个解锁的人(5个工作线程),他们可以开锁,于是他们分别去开一把锁,开完锁就会接着去干自己的事情了,等到最后一把锁被打开了,此时这个人才能出门,继续干自己的事情。
注意:JUC中还要一个同步工具类CyclicBarrier,它与CountDownLatch的作用类似,不过还是有所区别。CyclicBarrier举例:比如现在有一个门,门上有5把锁,此时有五个人需要通过这扇门,它们每个人只能打开一把锁,所以执行情况是,来一个人开一把锁,然后等着,直到最后一个人来了打开了最后一把锁。此时5个人才可以通过这扇门。

2.常用方法

CountDownLatch 提供了一些常用的方法:

方法说明
await()使当前线程进入同步队列进行等待,直到state的值被减到0或者当前线程被中断,当前线程就会被唤醒。
await(long timeout, TimeUnit unit)带超时时间的await()。超过指定时间,则线程取消阻塞
countDown()使state的值减1,如果减到了0,则会唤醒所有等待在这个latch上的线程。
getCount()获得当前state的数值。

3.例子

下面代码演示2个等待线程通过CountDownLatch去等待5个工作线程完成操作:

public class CountDownLatchTest {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(5);//state初始值设置为5
        new Thread("waiting thread"){ //等待线程
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + " waiting...");
                try {
                    //waiting thread 等待线程 前面的操作
                    countDownLatch.await();//阻塞住,直到state=0,才继续执行
                    //waiting thread 等待线程 后续的操作
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " wait to end...");
            }
        }.start();
        for (int i = 0; i < 5; i++) {
            new Thread("thread" + (i + 1)) {
                @Override
                public void run() {
                    countDownLatch.countDown();//state-1,当减至state=0时,则去唤醒所有的因调用countDownLatch.await()而阻塞住的线程
                    System.out.println(Thread.currentThread().getName() + " countDown..." + " count 剩余:" + countDownLatch.getCount());
                    //接着执行自己的后续操作
                }
            }.start();
        }
        //main 等待线程前面的操作
        System.out.println(Thread.currentThread().getName() + " waiting...");
        //main 等待线程
        countDownLatch.await();//阻塞住,直到state=0,才继续执行
        //main 等待线程 后续的操作
        System.out.println(Thread.currentThread().getName() + " wait to end...");
    }
}

执行结果:
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值