Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CountDownLatch介绍

CountDownLatch介绍

原创
作者头像
HLee
修改于 2021-10-15 09:44:11
修改于 2021-10-15 09:44:11
96900
代码可运行
举报
文章被收录于专栏:房东的猫房东的猫
运行总次数:0
代码可运行

简介

CountDownLatch中count down是倒数的意思,latch则是门闩的含义。整体含义可以理解为倒数的门栓,似乎有一点“三二一,芝麻开门”的感觉。CountDownLatch的作用也是如此,在构造CountDownLatch的时候需要传入一个整数n,在这个整数“倒数”到0之前,主线程需要等待在门口,而这个“倒数”过程则是由各个执行线程驱动的,每个线程执行完一个任务“倒数”一次。总结来说,CountDownLatch的作用就是等待其他的线程都执行完任务,必要时可以对各个任务的执行结果进行汇总,然后主线程才继续往下执行,存在于java.util.cucurrent包下。

CountDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。

  • countDownLatch是一个计数器,线程完成一个记录一个,计数器递减且只能只用一次。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//构造函数:参数count为计数值
public CountDownLatch(int count) { };  

//调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
public void await() throws InterruptedException { };   
//和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  
//将count值减1
public void countDown() { };  

使用示例

普通示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CountDownLatchTest {

    public static void main(String[] args) {

        // 计数器的初始值是线程的数量
        final CountDownLatch latch = new CountDownLatch(2);
        System.out.println("主线程开始执行");
        //第一个子线程执行
        ExecutorService es1 = Executors.newSingleThreadExecutor();
        es1.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                    System.out.println("子线程:" + Thread.currentThread().getName() + "执行");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                latch.countDown();
            }
        });
        es1.shutdown();

        //第二个子线程执行
        ExecutorService es2 = Executors.newSingleThreadExecutor();
        es2.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("子线程:" + Thread.currentThread().getName() + "执行");
                latch.countDown();
            }
        });
        es2.shutdown();
        System.out.println("等待两个线程执行完毕");
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("两个子线程都执行完毕,继续执行主线程");
    }
}
执行结果:
主线程开始执行
等待两个线程执行完毕
子线程:pool-1-thread-1执行
子线程:pool-2-thread-1执行
两个子线程都执行完毕,继续执行主线程

并发示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CountDownLatchTest2 {
    public static void main(String[] args) {
        ExecutorService pool = Executors.newCachedThreadPool();
        CountDownLatch cdl = new CountDownLatch(100);
        for (int i = 0; i < 100; i++) {
            CountRunnable runnable = new CountRunnable(cdl);
            pool.execute(runnable);
        }
    }
}

class CountRunnable implements Runnable {

    private CountDownLatch countDownLatch;

    public CountRunnable(CountDownLatch countDownLatch) {
        this.countDownLatch = countDownLatch;
    }

    @Override
    public void run() {
        try {
            synchronized (countDownLatch) {
                // 每次减少一个容量
                countDownLatch.countDown();
                System.out.println("thread counts = " + (countDownLatch.getCount()));
            }
            countDownLatch.await();
            System.out.println("concurrency counts = " + (100 - countDownLatch.getCount()));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
执行结果;
thread counts = 99
thread counts = 98
thread counts = 97
thread counts = 96
......
hread counts = 3
thread counts = 2
thread counts = 1
thread counts = 0
concurrency counts = 100
concurrency counts = 100
concurrency counts = 100
......

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java之CountDownLatch原理浅析
调用countDown方法时,N就会减1,CountDownLatch的await方法会阻塞当前线程,直到N变成零。
闻说社
2024/11/13
1090
Java之CountDownLatch原理浅析
带你了解控制线程执行顺序的几种方法
通常情况下,线程的执行顺序都是随机的,哪个获取到CPU的时间片,哪个就获得执行的机会。不过实际的项目中有时我们会有需要不同的线程顺序执行的需求。借助一些java中的线程阻塞和同步机制,我们往往也可以控制多个线程的执行顺序。
用户7634691
2020/08/10
1.9K0
面试官:说说CountDownLatch,CyclicBarrier,Semaphore的原理?
CountDownLatch适用于在多线程的场景需要等待所有子线程全部执行完毕之后再做操作的场景。
艾小仙
2021/01/05
5600
CountDownLatch、CyclicBarrier、Semaphore的区别,你知道吗?
从结果可以看出,当四个线程都到达barrier状态后,会从四个线程中选择一个线程去执行Runnable。
好好学java
2020/03/24
1.3K0
JAVA多线程(一)
一个进程可以包含多个线程。多个线程可以并行,但是一个时间点只能有一个线程是运行状态。
JQ实验室
2022/02/09
1690
CountDownLatch讲解-Junit实现多线程测试
我们知道使用junit进行多线程测试时,主线程执行完毕后直接结束所有线程,(这就好比我前文说线程五种状态中的“STOP”,就是不接受新任务,中断当前正在运行的任务。)导致很多子线程没有执行完呢就已经关闭了,所以为了解决这个问题我们就需要讲解一个JUC又一个重要的类CountDownLatch,使用AQS状态表示计数,可以把它看成是一个计数器,源码注释第一句话:A synchronization aid that allows one or more threads to wait until,翻译过来就是:允许一个或多个线程等待。好,让我们揭开CountDownLatch的面纱,并用它解决junit多线程问题。
胖虎
2019/06/26
1.4K0
CountDownLatch讲解-Junit实现多线程测试
CountDownLatch使用解析
正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。在Java并发中,countdownlatch的概念是一个常见的面试题,所以一定要确保你很好的理解了它。在这篇文章中,我将会涉及到在Java并发编程中跟CountDownLatch相关的以下几点:
程序新视界
2022/05/06
4670
CountDownLatch使用解析
CountDownLatch——闭锁的实现之一
CountDownLatch实际上是一种闭锁实现。闭锁:是一种同步工具类,可以延迟线程的进度知道其到达终止状态——《Java并发编程实战》。这个怎么解释呢?简单来说,就是有1个线程需要等待其余10个线程都执行完毕后再执行,这个时候就可以使用闭锁,也即CountDownLatch(当然闭锁的实现并不止这一种)。关于对闭锁的详细解释请参考《Java并发编程实战》P79。 CountDownLatch中有一个计数器,该计数器通过构造方法传递,表示需要完成的工作。有两个主要的方法:countDown——表示计数器减
用户1148394
2018/01/09
7450
CountDownLatch——闭锁的实现之一
CountDownLatch:别浪,等人齐再团!
咳咳,不对。大家好,我是磊哥,今天给大家来一篇 CountDownLatch 的文章。
磊哥
2021/04/02
3510
Java同步组件之CountDownLatch,Semaphore
Java同步组件概况 CountDownLatch : 是闭锁,通过一个计数来保证线程是否一直阻塞 Semaphore: 控制同一时间,并发线程数量 CyclicBarrier:字面意思是回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。 ReentrantLock:是一个重入锁,一个线程获得了锁之后仍然可以反复加锁,不会出现自己阻塞自己的情况。 Condition:配合ReentrantLock,实现等待/通知模型 FutureTask:FutureTask实现了接口Future,同Fu
开源日记
2021/02/05
5290
CountDownLatch用法、详解
`CountDownLatch`是Java并发包中的一个同步工具类,用于控制线程的执行顺序和协调多个线程之间的操作。它通过一个计数器来实现,计数器的初始值由用户指定,每当一个线程完成了特定任务或达到了某个状态,计数器的值就会减少。当计数器的值变为0时,等待`CountDownLatch`的线程将被释放。
一百减一是零
2024/08/07
7460
Java Review - 并发编程_ CountDownLatch原理&源码剖析
在日常开发中经常会遇到需要在主线程中开启多个线程去并行执行任务,并且主线程需要等待所有子线程执行完毕后再进行汇总的场景。
小小工匠
2021/12/30
2490
Java Review - 并发编程_ CountDownLatch原理&源码剖析
深入理解JUC:第四章:CountDownLatch倒计时器
CountDownLatch是一个非常实用的多线程控制工具类。常用的就下面几个方法:
Java廖志伟
2021/01/29
4030
使用CountDownLatch协调子线程
从JDK 1.5之后,在java.util.concurrent包下引入了好多的处理多线程的工具类,本文将介绍CountDownLatch工具类,并采用这个工具类给出一个实例。
孟君
2023/02/23
2390
使用CountDownLatch协调子线程
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
Semaphore属于共享锁,即多个线程可以同时获取,用来表示可用资源的个数,本质上是一个计数器
终有救赎
2023/10/16
7120
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
五分钟教会你JUC中的“CountDownLatch”和“CyclicBarrier”应该如何使用
JUC作为Java面试的必考板块,其重要性不言而喻。学习JUC包下的常用类不仅仅是在学习这些类怎么使用,更是在学习这些类中所蕴藏的设计思维。
程序员牛肉
2024/09/30
1170
五分钟教会你JUC中的“CountDownLatch”和“CyclicBarrier”应该如何使用
CycliBarriar和CountdownLatch有什么区别
在Java中CycliBarriar和CountdownLatch有什么区别?CyclicBarrier可以重复使用,而CountdownLatch不能重复使用。
BUG弄潮儿
2020/06/22
4.2K1
CountDownLatch类的使用
JDk1.5提供了一个非常有用的包,Concurrent包,这个包主要用来操作一些并发操作,提供一些并发类,可以方便在项目当中傻瓜式应用。
端碗吹水
2020/09/23
5150
CountDownLatch和CyclicBarrier 傻傻的分不清?超长精美图文又来了
并发编程的三大核心是分工,同步和互斥。在日常开发中,经常会碰到需要在主线程中开启多个子线程去并行的执行任务,并且主线程需要等待所有子线程执行完毕再进行汇总的场景,这就涉及到分工与同步的内容了
用户4172423
2020/07/03
5000
CountDownLatch和CyclicBarrier 傻傻的分不清?超长精美图文又来了
程序员如何控制并发流程、CountDownLatch等四大工具
这个场景是一等多的场景,比如去医院看病,检查完一项,盖一个章,盖好了再去主治医生进行下一步,或者拼多多,需要等其他人操作完,比如5个人拼团,你得等其他4个人执行countDown,才能拼单成功
Joseph_青椒
2023/09/03
2610
程序员如何控制并发流程、CountDownLatch等四大工具
推荐阅读
相关推荐
Java之CountDownLatch原理浅析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验