首页 > 其他分享 >CountDownLatch 学习笔记

CountDownLatch 学习笔记

时间:2023-04-23 23:36:15浏览次数:34  
标签:Thread int CountDownLatch 笔记 学习 计数器 线程 countDownLatch

1. 概念

CountDownLatch是在JDK 1.5的时候被引入的,位于java.util.concurrent并发包中,CountDownLatch叫做闭锁,也叫门闩。允许一个或多个线程一直等待,直到其他线程执行完成后再执行。

2.工作原理

CountDownLatch通过一个计数器来实现的。计数器的初始化值为线程的数量。每当一个线程完成自己的任务后,计数器的值就相应的减1.当计数器的值减到0时,表示所有的线程都已经完成任务。然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。

3. 常见方法

  • public CountDownLatch(int count)

​ CountDownLatch接收一个int型参数,表示要等待的工作线程的个数。

  • public void await()

​ 使用当前线程进入同步队列进行等待,直到计数器的值减到0或者当前线程被中断,当前线程就会被唤醒。

  • public boolean await(Long timeout,TimeUnit unit)
@Slf4j
public class CountDownLatchTest {
    //线程总数
    private final static int threadCount = 200;

    public static void main(String[] args) throws Exception {
        //创建固定线程数的线程池
        ExecutorService exec = Executors.newFixedThreadPool(threadCount);
        //如果有n个子线程,则指定CountDownLatch的计数器为n
        final CountDownLatch countDownLatch = new CountDownLatch(threadCount);

        //提交到线程池
        for (int i = 0; i < threadCount; i++) {
            exec.execute(()->{
                try{
                    System.out.println("子线程:"+Thread.currentThread().getName()+"开始执行");
                    //模拟每个线程处理业务,耗时一秒钟
                    TimeUnit.SECONDS.sleep(1);
                    System.out.println("子线程:"+Thread.currentThread().getName()+"执行完成");
                    //当前线程调用此方法,则计数减一
                    countDownLatch.countDown();
                }catch (Exception e){
                    e.printStackTrace();
                }
            });
        }
        // 阻塞当前线程(此例子就是main主线程), 直到计数器的值为0,主线程才开始处理
        countDownLatch.await();
        System.out.println("等待子线程执行完毕,主线程 : "+ Thread.currentThread().getName()+"开始执行,此时CountDownLatch的计数器为 :" + countDownLatch.getCount());

        //销毁线程
        exec.shutdown();
//            final int threadNum = i;
//            exec.execute(() ->{
//                try{
//                    test(threadNum);
//                }catch (Exception e){
//                    log.error("exception",e);
//                }finally {
//                    countDownLatch.countDown();
//
//                }
//            });
//
//        countDownLatch.await();
//        log.info("finish");
//        exec.shutdown();

    }

    private static void test(int threadNum) throws Exception{

        Thread.sleep(100);
        log.info("{}",threadNum);
        Thread.sleep(100);

    }
} 

标签:Thread,int,CountDownLatch,笔记,学习,计数器,线程,countDownLatch
From: https://www.cnblogs.com/shine-rainbow/p/17348112.html

相关文章

  • layui学习4(弹出组件)
    1.弹出组件使用方法1.作为独立组件使用:下载layer引入js文件,加载1.8版本以上的jQuery的js文件和layer.js文件2.layui模块化使用:只需要引入layui中的css与js文件,在script中使用layui.use()加载模块即可 下载layer组件:layer弹出层组件-jQuery弹出层插件(ilayuis.com) ......
  • 算法学习day05数组part扩展-69、35、34
    packageLeetCode.arraypart01;/***69.x的平方根*给你一个非负整数x,计算并返回x的算术平方根。*由于返回类型是整数,结果只保留整数部分,小数部分将被舍去。*注意:不允许使用任何内置指数函数和算符,例如pow(x,0.5)或者x**0.5。*示例:*输入:x=......
  • linux dts 设备树学习
    参考https://zhuanlan.zhihu.com/p/376755248https://blog.csdn.net/to_be_better_wen/article/details/128044597一.设备树简介 linux设备树devicetree,设备树的源文件称为DTS. linux内核从3.x开始引入设备树概念,用于实现驱动代码与设备信息相分离。在设备树以前,所有关......
  • Fine-Grained学习笔记(1):卷积,FFT
    Fine-Grained,在算法复杂度理论中特指,对各类算法的复杂度,进行(相较于P与NP的粗粒度分类的)细粒度分类,例如,证明某问题存在$n^2/\logn$的算法.Fine-Grained是一个新兴领域,其研究前景可看作是计算机科学学科中的石墨烯与钙钛矿(误).本系列主要参考UniversityofIllinoisa......
  • 【学习笔记】2-SAT
    适应性问题存在若干命题\(p_i\),以及若干形如\(x_{k_1}\lorx_{k_2}\lor\dots\lorx_{k_n}\)的\(s_k\),其中\(x_i\)为\(p_i\)或\(\lnotp_i\)其中一个。要求是否存在一个命题的取值集合使得条件\(s\)均成立,其中每个条件最多包含\(n\)个命题,这样的问题称为n-SAT问......
  • 动手深度学习pytorch 5-7章
    深度学习计算1.块提供的基本功能:1.输入数据作为前向传播函数的参数2.通过前向传播函数生成输出3.计算其输出关于输入的梯度4.存储和访问前向传播计算所需的参数5.根据需要初始化模型参数2.Sequential类1.将块逐个追加到列表中的函数......
  • 深度学习--卷积神经网络基础
    深度学习--卷积神经网络基础1.卷积操作卷积操作简单来说就是矩阵对应位置相乘求和,这样不仅可以减少模型的参数数量,还可以关注到图像的局部相关特性。importtorchimporttorch.nnasnnimporttorch.nn.functionalasF#卷积操作(Input_channel:输入的通道数,kernel_channel......
  • Java学习笔记(四)
    1、break、continue、return的区别(1)break常在switchcase中使用,也可以在循环中使用。作用:当遇到break,则结束当前整个switchcase语句或者当前整个循环。执行外面语句。(2)continue:只能在循环中使用。作用是结束当前这一次循环,执行下一次循环。(3)return:在方法中使用,作用是结束当前......
  • JS课堂笔记(4.17-4.21)
    一、循环 1.在程序中,一组被重复执行的语句被称为循环体,能否继续重复执行,取决于循环的终止条件。由循环体及循环的终止条件组成的语句,被称为循环语句。2.循环执行的过程是①第一次循环:第一次赋值,然后条件判断,执行循环体,最后执行累计。②非第一次循环:条件判断,执行循环体,最后执行......
  • 《综述图论中连通性及相关问题的一些处理方法》笔记
    基本概念边/点割集:若边集\(E'\)使得割掉这些边之后\(u\tov\)不连通,则\(E'\)是\((u,v)\)的边割集。类似地定义点割集。边/点连通度:若任意\((u,v)\)的割集大小都至少是\(s\),则\(u,v\)是\(s-\)边连通的。类似地定义点连通度。Menger定理:\(u\tov\)的边连通......