CountDownLatch理论利用


明天是正月十五,给大家拜个暮年啦!

元宵节是中国传统节日,吃汤圆不能少啊,明天咱们统计下“叫练”吃汤圆工夫,并用代码模仿下叫练吃汤圆!其中用到咱们的CountDownLatch了!

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()阻塞期待"叫练线程"执行结束,最初主线程统计“叫练”线程执行吃完汤圆所破费工夫。执行可能后果如下图所示。

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

和Join比拟


上述代码CountDownLatch齐全能够用join代替,在“叫练”线程中先返回一个Thread,而后用Thread调用join办法,也能够达到下面的成果。

然而还有一点须要留神的是,如果上述代码换成线程池,join就不好用了,join自身底层是调用wait办法来实现阻塞的,须要间接与线程相关联,而线程池对线程进行了封装解决,线程池线程复用,线程内置,无奈通过线程对外提供join接口,所以join应用上就有局限性了,而CountDownLatch应运而生。绝对于Join来说,CountDownLatch不依赖线程,能和线程池联合起来用,绝对灵便,在理论场景中举荐应用

总结


明天咱们介绍了CountDownLatch,整理出来心愿能对你有帮忙,写的比不全,同时还有许多须要修改的中央,心愿亲们加以斧正和点评,喜爱的请点赞加关注哦。点关注,不迷路,我是叫练【公众号】,微信号【jiaolian123abc】边叫边练。