StopWatch 的源码比较简单,整个类实现了对时间的计时和统计。

具体来说,StopWatch 类实现了 org.springframework.util.StopWatch 接口,主要有以下字段:

  • private boolean keepTaskList = true;:是否记录任务列表,默认为 true。
  • private final List<TaskInfo> taskList = new ArrayList<>();:记录任务列表的集合。
  • private long totalTimeMillis;:总耗时。
  • private long startTimeMillis;:开始时间。
  • private String id;:标识当前 StopWatch 实例的 ID。

主要方法如下:

  1. public StopWatch() 构造函数,用于创建一个 StopWatch 实例,并设置默认的 ID。

  2. public StopWatch(String id) 构造函数,用于创建一个 StopWatch 实例,并设置指定的 ID。

  3. public void setId(String id) 设置 StopWatch 实例的 ID。

  4. public String getId() 获取 StopWatch 实例的 ID。

  5. public void setKeepTaskList(boolean keepTaskList) 设置是否记录任务列表。

  6. public void start() 开始计时。

  7. public void stop() 停止计时。

  8. public void reset() 重置计时器。

  9. public long getTotalTimeMillis() 获取总耗时。

  10. public List<TaskInfo> getTaskInfo() 获取任务列表。

start() 方法中,会记录当前时间作为开始时间,并把 running 标志置为 true;在 stop() 方法中,会记录当前时间作为结束时间,并更新总耗时,同时把 running 标志设置为 false;在 reset() 方法中,会将状态重置,并清空任务列表。

在统计任务执行时间时,StopWatch 通过 TaskInfo 对象来记录任务信息,该对象包含任务名称、任务开始和结束时间:

private static final class TaskInfo implements Serializable {private final String taskName;private final long timeMillis;private final long nanoTime;TaskInfo(String taskName, long timeMillis, long nanoTime) {this.taskName = taskName;this.timeMillis = timeMillis;this.nanoTime = nanoTime;}public String getTaskName() {return taskName;}public long getTimeMillis() {return timeMillis;}public long getNanoTime() {return nanoTime;}
}

StopWatch 中,每个任务的时间信息以一个 TaskInfo 对象的形式保存在一个列表中,方便进行时间统计。通过调用 getTaskInfo() 方法可以获取所有任务的时间信息,包括时间、任务名称等。如果需要记录更详细的信息,可以重写 TaskInfo 类或者直接通过获取开始和结束时间来进行额外的逻辑处理。

总之,StopWatch 的源码实现比较简单,主要是对时间的计时和统计,方便进行性能分析和调试。

StopWatch的源码分析相关推荐

  1. MapReduce中Client提交Job源码分析

    回顾 在进行submit源码分析之前,先来回顾一下WordCount案例(点击查看WordCount案例).仔细回想一下曾经Client都干了点啥?获取对象-->一通set-->job.w ...

  2. Spring Boot 2.x 启动全过程源码分析(全)

    上篇<Spring Boot 2.x 启动全过程源码分析(一)入口类剖析>我们分析了 Spring Boot 入口类 SpringApplication 的源码,并知道了其构造原理,这篇我 ...

  3. 【SpringClould】Spring Cloud Eureka源码分析

    文章目录 1.概述 1.1 Eureka的一些概念 2.源码分析 2.1 Eureka Server源码 2.1.1 `@EnableEurekaServer`注解 2.1.2 EurekaServe ...

  4. spring boot 2.0 源码分析(三)

    通过上一章的源码分析,我们知道了spring boot里面的listeners到底是什么(META-INF/spring.factories定义的资源的实例),以及它是创建和启动的,今天我们继续深入分 ...

  5. Springboot源码分析第一弹 - 自动装配实现

    Springboot就不用多了吧,解放Java开发双手的神器. 最显著的特点就是,去配置化,自动装配,自动配置.让开发人员只需要注重业务的开发 今天就来了解一下自动装配的源码是怎么实现的 预先准备 直 ...

  6. 【SpringCloud系列】服务注册与发现 - Eureka Server源码分析(2)

    3.6.Eureka Server 源码分析 上一篇文章简单介绍了 Eureka 的一些概念,今天咱们来看看其原理和源码,首先先看 Eureka Server 的原理. 3.6.1.Eureka Se ...

  7. Feign源码分析(without spring)

    https://spring-cloud-wiki.readthedocs.io/zh_CN/latest/pages/feign.html 简介 Feign是一个声明式的Web Service客户端 ...

  8. springboot源码分析

    快速开发底层原理 SpringBoot核心理念 能够实现帮助开发者快速的整合第三方框架(Spring.Mybatis.hibernate) 原理:Maven依赖封装整合和自定义starter. 完全去 ...

  9. Eureka服务续约(Renew)源码分析

    主要对Eureka的Renew(服务续约),从服务提供者发起续约请求开始分析,通过阅读源码和画时序图的方式,展示Eureka服务续约的整个生命周期.服务续约主要是把服务续约的信息更新到自身的Eurek ...

最新文章

  1. 网络摄像机如何与路由器连接方法
  2. 关于文字邮件日文乱码的问题
  3. js面向对象小结(工厂模式,构造函数,原型方法,继承)
  4. webService学习9:jquery ajax调用webservice
  5. 零碎的小知识点 ----------C# ToString()函数注意事项
  6. python获取命令行参数_【整理】Python中如何获得并处理命令行参数
  7. ef6 oracle 存储过程,具有多个结果集的存储过程-EF6 | Microsoft Docs
  8. django 获取 axios get 过来的数据_一起DevOps系列12django数据库创建与使用
  9. 最大后验估计_状态估计的基本概念(3)最小均方估计和最小均方误差估计
  10. VS:无法将“char *”转换为“const wchar_t *”/不能将参数从“const char []”转换为“const wchar_t *”
  11. 基于Java+Spring+vue+element实现旅游信息管理平台系统
  12. 闲聊人工智能产品经理(AIPM)—定义人工智能产品经理
  13. 计算机专业logo元素,计算机系logo设计大赛
  14. 在Chrome谷歌浏览器中使用H5地理位置API
  15. VueConf 感想与总结
  16. mc查询服务器状态,MC 服务器 所有指令 急要
  17. FreeRTOS 任务调度 任务切换
  18. java实现画笔的画圆与矩形功能_Java实现画线、矩形、椭圆、字符串功能
  19. html5 语音输入小话筒,HTML5语音输入方法
  20. linux命令之ls

热门文章

  1. 自动驾驶仿真(六)—— SIL软件在环仿真测试
  2. 2021高考本溪高中成绩查询,本溪市高级中学2020—2021学年度(上学期) 高一高二期中表奖大会...
  3. 快手签名算法php,2019 快手API签名算法
  4. java Map的知识点
  5. PHP 验证码图片无法正常显示
  6. android 桥接,路由器一键桥接Android实现
  7. 二本计算机,4年开发,年包才40多万。二本真的不如985/211吗?
  8. git for windows下载
  9. Java程序猿必学第十一篇——接口
  10. linux7操作,Linux centos7 基本操作 七