zoukankan      html  css  js  c++  java
  • 正月十五吃汤圆CountDownLatch

    CountDownLatch实际应用


    今天是正月十五,给大家拜个晚年啦!

    元宵节是中国传统节日,吃汤圆不能少啊,今天我们统计下“叫练”吃汤圆时间,并用代码模拟下叫练吃汤圆!其中用到我们的CountDownLatch了!

    image.png

    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.TimeUnit;
    
    /**
     * @author :jiaolian
     * @date :Created in 2021-02-26 14:49
     * @description:CountDownLatch模拟统计吃汤圆花费时间
     * @modified By:
     * 公众号:叫练
     */
    public class CountDownLatchSpeedTimeTest {
    
        public static void main(String[] args) throws InterruptedException {
            //定义一个CountDownLatch计数器
            CountDownLatch countDownLatch = new CountDownLatch(1);
            long start = System.currentTimeMillis();
            //创建一个“叫练”线程吃汤圆
            new Thread(()->{
                int time = (int)(Math.random()*10) + 1;
                //模拟统计吃汤圆花费
                try {
                    TimeUnit.SECONDS.sleep(time);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"吃完汤圆");
                //计数器递减
                countDownLatch.countDown();
            },"叫练线程").start();
            //主线程阻塞等待"叫练线程"执行完毕
            countDownLatch.await();
            System.out.println("主线程:吃汤圆共花费"+(System.currentTimeMillis()-start)+"毫秒");
        }
    }

    如上代码所示:一共有两个线程,主线程和自定义“叫练”线程,在主线程中定义一个CountDownLatch计数器,初始值为1,创建一个“叫练”线程用随机数模拟吃汤圆时间,主线程调用countDownLatch.await()阻塞等待"叫练线程"执行完毕,最后主线程统计“叫练”线程执行吃完汤圆所花费时间。执行可能结果如下图所示。

    image.png

    上面代码我们用到了CountDownLatch,他实际上是一个计数器,主线程调用await()方法会让主线程阻塞直到计数器值为0会返回,上面案例CountDownLatch初始化值为1,在“叫练”线程吃完汤圆会执行countDownLatch.countDown(),计数器会减1,此时CountDownLatch等于0,所以主线程继续执行最后一句代码统计“叫练”线程执行时长。所以在时间顺序上两个线程看起来是这样的。如下图所示。 如果不调用countDownLatch.await(),主线程不会等待,程序会立刻返回,在实际项目场景中,一般CountDownLatch可以来统计多线程执行时长来测试多线程执行性能。另外在CountDownLatch没有出现时,我们用join方法替代。

    image.png

     

     

    和Join比较


    上述代码CountDownLatch完全可以用join替代,在“叫练”线程中先返回一个Thread,然后用Thread调用join方法,也可以达到上面的效果。

    但是还有一点需要注意的是,如果上述代码换成线程池,join就不好用了,join本身底层是调用wait方法来实现阻塞的,需要直接与线程相关联,而线程池对线程进行了封装处理,线程池线程复用,线程内置,无法通过线程对外提供join接口,所以join使用上就有局限性了,而CountDownLatch应运而生。相对于Join来说,CountDownLatch不依赖线程,能和线程池结合起来用,相对灵活,在实际场景中推荐使用

     

     

    总结


    今天我们介绍了CountDownLatch,整理出来希望能对你有帮助,写的比不全,同时还有许多需要修正的地方,希望亲们加以指正和点评,喜欢的请点赞加关注哦。点关注,不迷路,我是叫练【公众号】,微信号【jiaolian123abc】边叫边练。

     

  • 相关阅读:
    关于将so 打包入APK的问题
    求 在独立service 中 调用contentprovider的方法
    ndk 环境下 c版 md5
    请教大牛们一个问题
    编写 service 与导出 jar 时注意的问题
    引入已编译好的动态库
    PHP 日期格式说明
    Ocaml 插件
    【转】简单至极的 PHP 缓存类
    PHP mysqlnd cannot connect to MySQL 4.1+ using old authentication
  • 原文地址:https://www.cnblogs.com/jiaolian/p/14453245.html
Copyright © 2011-2022 走看看