源码阅读之Stopwatch

Stopwatch 一般用于程序的计时运算,用于性能调试。

自己实现,也就是调用SimpleDateFormat 时间函数,start()时候调用,需要时间戳就再次调用

先写个demo:

 Stopwatch stopwatch = Stopwatch.createStarted();
 Thread thread = new Thread(() -> {
     try {
         sleep(500);
     } catch (InterruptedException e) {
         e.printStackTrace();
stopwatch.stop();
 LOGGER.info("线程是否运行{} {}",stopwatch.isRunning(),stopwatch.toString());
 stopwatch.start();
 LOGGER.info("线程是否运行{} {}",stopwatch.isRunning(),stopwatch.toString());           }
 });
 thread.start();
 try {
     thread.join();
 } catch (InterruptedException e) {
     e.printStackTrace();
 }
 LOGGER.info("线程是否运行{} {}",stopwatch.isRunning(),String.valueOf(stopwatch.elapsed(TimeUnit.MILLISECONDS)));
 stopwatch.stop();
 LOGGER.info("线程是否运行{} {}",stopwatch.isRunning(),stopwatch.toString());
 stopwatch.start();
 LOGGER.info("线程是否运行{} {}",stopwatch.isRunning(),stopwatch.toString());

Stopwatch类有四个成员变量

private final Ticker ticker;  //计时器
private boolean isRunning;     //是否运行的标志位
private long elapsedNanos;     //表示从调用start()到现在所经过的时间
private long startTick;     //开始的时间

几个看起来比较陌生的方法:

private long elapsedNanos() {
    return this.isRunning ? this.ticker.read() - this.startTick + this.elapsedNanos : this.elapsedNanos;
}
Stopwatch本身的私有方法,没有暴露出去,而是暴露了下面的带有时间单位参数的方法.
public long elapsed(TimeUnit desiredUnit) {
    return desiredUnit.convert(this.elapsedNanos(), TimeUnit.NANOSECONDS);
}

返回从开始到现在的时间,如果秒表 isRunning == false ,就返回秒表结束的时间。

其他几个方法:

public static Stopwatch createUnstarted() 

需要注意的是,调用这个方法的时候,stopwatch就已经开始运行了

public Stopwatch start() 
public Stopwatch stop() 
public Stopwatch reset() 
public boolean isRunning() {   return this.isRunning;   }

猜你喜欢

转载自blog.csdn.net/w535921917/article/details/84930805