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。
主要方法如下:
-
public StopWatch()
构造函数,用于创建一个StopWatch
实例,并设置默认的 ID。 -
public StopWatch(String id)
构造函数,用于创建一个StopWatch
实例,并设置指定的 ID。 -
public void setId(String id)
设置StopWatch
实例的 ID。 -
public String getId()
获取StopWatch
实例的 ID。 -
public void setKeepTaskList(boolean keepTaskList)
设置是否记录任务列表。 -
public void start()
开始计时。 -
public void stop()
停止计时。 -
public void reset()
重置计时器。 -
public long getTotalTimeMillis()
获取总耗时。 -
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
的源码实现比较简单,主要是对时间的计时和统计,方便进行性能分析和调试。