写点什么

正月十五吃汤圆 CountDownLatch

用户头像
叫练
关注
发布于: 2021 年 02 月 26 日
正月十五吃汤圆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】边叫边练。


发布于: 2021 年 02 月 26 日阅读数: 10
用户头像

叫练

关注

我是叫练,边叫边练 2020.06.11 加入

Java高级工程师,熟悉多线程,JVM

评论

发布
暂无评论
正月十五吃汤圆CountDownLatch