正月十五吃汤圆CountDownLatch

CountDownLatch实际应用

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

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

如上代码所示:一共有两个线程,主线程和自定义”叫练”线程,在主线程中定义一个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】边叫边练。

Original: https://www.cnblogs.com/jiaolian/p/14453245.html
Author: 叫练
Title: 正月十五吃汤圆CountDownLatch

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/589900/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringMVC(5)-ssm整合实现增删改查-mybatis层

    mybatis层编写完毕后的项目目录 1.右键SpringMVC2项目-》new-》Modual-》选择maven项目(我的项目名为Study09_ssm),输入模块名,点击Fin…

    Java 2023年6月9日
    065
  • private static final long serialVersionUID = 1L 的作用

    1、这句话的意思是定义程序序列化ID 2、什么是序列化? Serializable,Java的一个接口,用来完成java的序列化和反序列化操作的; 任何类型只要实现了Seriali…

    Java 2023年6月5日
    079
  • Java学习JDK环境和工具

    卸载JDK 删除Java安装目录 删除Java_Home 删除path下关于Java的目录 Java-version 安装JDK 百度搜索JDK8,安装下载 同意协议 下载电脑对应…

    Java 2023年6月13日
    067
  • MyBatis Plus 里调用存储过程

    mapper接口 public interface UserInfoMapper extends BaseMapper { void countByType(String chec…

    Java 2023年5月30日
    078
  • 商城秒杀系统总结(Java)

    本文写的较为零散,对没有基础的同学不太友好。 一、秒杀系统项目总结(基础版) classpath 在.properties中时常需要读取资源,定位文件地址时经常用到 classpa…

    Java 2023年6月7日
    096
  • 【Java面试】准备跳槽!那这期面试题必须要会,请描述一下Redis的缓存淘汰策略

    “请你描述一下Redis的缓存淘汰策略”你如果你正好遇到这个问题,想好怎么回答了吗?关于这个问题,我把高手的回答整理到了15W字的面试文档里面大家可以私信留…

    Java 2023年6月16日
    069
  • erlang虚拟机代码执行原理

    erlang 是开源的,很多人都研究过源代码。但是,从erlang代码到c代码,这是个不小的跨度,而且代码也比较复杂。所以这里,我利用一些时间,整理下 erlang代码的执行过程,…

    Java 2023年5月30日
    097
  • JavaWeb2

    web服务器软件:Tomcat 1.1 概述 服务器:安装了服务器软件的计算机 服务器软件:接受用户的请求,处理请求,做出响应 web服务器软件:接受用户的请求,处理请求,做出响应…

    Java 2023年6月6日
    084
  • SpringBoot 如何进行对象复制

    首先我们看看为什么需要对象复制? 为什么需要对象复制 如上,是我们平时开发中最常见的三层MVC架构模型,编辑操作时Controller层接收到前端传来的DTO对象,在Service…

    Java 2023年5月29日
    070
  • SpringBoot学习笔记

    SpringBOOt概念 SpringBoot提供了一种快速使用Spring的方式,基于约定大于配置的思想,让开发人员专注于逻辑业务,从而提高开发效率 SpringBoot快速入门…

    Java 2023年6月5日
    079
  • Java线程的6种状态转换

    Java线程的生命周期 与操作系统中线程的五种状态区分开,Java线程有以下6种状态: New 新建 Runnable 可运行 Blocked 阻塞 Waiting 等待 Time…

    Java 2023年6月5日
    0136
  • uboot常用命令及其使用

    ? 或者 help 第一次使用uboot,通过?查看所有帮助信息 ?cmd 或者 help cmd ? bootz #查看bootz命令的帮助信息 通过该命令查看某个cmd的帮助信…

    Java 2023年6月6日
    048
  • java selenium (六) XPath 定位

    xpath 的定位方法, 非常强大。 使用这种方法几乎可以定位到页面上的任意元素。 什么是xpath xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XM…

    Java 2023年5月29日
    071
  • 长篇图解java反射机制及其应用场景

    一、什么是java反射? 在java的面向对象编程过程中,通常我们需要先知道一个Class类,然后 new 类名()方式来获取该类的对象…

    Java 2023年6月15日
    056
  • 关于乱码的解决

    创建一个新的项目解决乱码问题 今天在进行一个普通java文件的创建时,发现测试的demo不能输出中文,查看了系统设置之后,是因为系统的编码设置是默认的,为此我们要将编码设置为UTF…

    Java 2023年6月13日
    064
  • 使用 Spring Boot Admin 监控应用状态

    1 Spring Boot Actuator Spring Boot Actuator 是 Spring Boot 提供的对应用的自省和监控功能,如健康检查,审计,指标收集,HTT…

    Java 2023年6月16日
    091
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球