使用 ThreadLocal 为每个线程保存独立的开始时间
import java.util.Locale;
public class TimeTracker {
private final String trackerName;
private Long startTime;
// 构造方法,可指定追踪器名称
public TimeTracker() {
this.trackerName = Thread.currentThread().getName() + "-Tracker";
}
public TimeTracker(String name) {
this.trackerName = name + "-" + Thread.currentThread().getName();
}
public void start() {
this.startTime = System.currentTimeMillis();
System.out.println("[" + trackerName + "] 开始时间: " +
KentDataTime.getYYMMDDHHMMSSSSSString());
}
public void end() {
if (startTime == null) {
System.err.println("[" + trackerName + "] 警告: 请先调用 start()");
return;
}
System.out.println("[" + trackerName + "] 结束时间: " +
KentDataTime.getYYMMDDHHMMSSSSSString());
System.out.println("[" + trackerName + "] " +
formatDuration(System.currentTimeMillis() - startTime));
startTime = null; // 重置,允许重复使用
}
public String getElapsedTime() {
if (startTime == null) return "未开始";
return formatDuration(System.currentTimeMillis() - startTime);
}
private String formatDuration(long durationMillis) {
long totalSeconds = durationMillis / 1000;
long minutes = totalSeconds / 60;
long seconds = totalSeconds % 60;
long millis = durationMillis % 1000;
return String.format(Locale.CHINA, "花费了 %02d:%02d.%03d (共%dms)",
minutes, seconds, millis, durationMillis);
}
}
// 使用示例
public class Example {
public static void main(String[] args) {
// 每个对象独立计时
TimeTracker tracker1 = new TimeTracker("任务A");
TimeTracker tracker2 = new TimeTracker("任务B");
tracker1.start();
// ... 执行任务A
tracker1.end();
tracker2.start();
// ... 执行任务B
tracker2.end();
}
}
支持 Ctrl+A 全选,Ctrl+C 复制