共计 1818 个字符,预计需要花费 5 分钟才能阅读完成。
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】 边叫边练。