StopWatch秒表在Java中的用法

后端 潘老师 2个月前 (02-18) 77 ℃ (0) 扫码查看

在本文中,我们将探讨如何在Java中创建一个简单的秒表,并重点讲下StopWatch秒表在Java中的用法。秒表是测量方法执行时间的便捷工具,有助于我们跟踪请求处理中各个部分消耗的时间。

1. 在Java 8中实现自定义StopWatch用法

从Java 8开始,我们使用java.time.Instant类以纳秒精度捕获当前时间。要计算程序操作的执行时间,我们可以在程序执行开始之前和结束之后捕获当前时间。

Stopwatch stopwatch = new Stopwatch();
stopwatch.start();

// ...

stopwatch.stop();

long millis = stopwatch.getElapsedTime();
long nanos = stopwatch.getElapsedTime(TimeUnit.NANOSECONDS);

通过知道开始时间和结束时间之间的差异,我们可以计算程序的执行时间。为了实现自定义秒表,我们创建了一个Stopwatch类,当调用start()stop()方法时,它会记录开始时间和结束时间。如果我们没有调用stop()方法,它将返回从调用start()方法开始经过的时间。

Stopwatch.javapublic final class Stopwatch {
  private Instant startTime;
  private Instant endTime;
  private boolean running;
  public void start() {
    if (!running) {
      startTime = Instant.now();
      running = true;
    } else {
      System.out.println("Stopwatch is already running. Use stop() before starting again.");
    }
  }
  public void stop() {
    if (running) {
      endTime = Instant.now();
      running = false;
    } else {
      System.out.println("Stopwatch is not running. Use start() before stopping.");
    }
  }
  public Duration getElapsedDuration() {
    if (running) {
      return Duration.between(startTime, Instant.now());
    } else {
      return Duration.between(startTime, endTime);
    }
  }
  public long getElapsedTime() {
    Duration duration = getElapsedDuration();
    return duration.toMillis();
  }
  public long getElapsedTime(TimeUnit timeUnit) {
    return timeUnit.convert(getElapsedTime(), TimeUnit.MILLISECONDS);
  }
}

2. Apache Commons的StopWatch用法

Apache Commons Lang3库提供了org.apache.commons.lang3.time.StopWatch类的内置实现,我们可以直接在代码中使用。使用模式与我们之前讨论的自定义秒表类似。这个StopWatch提供了以下额外功能:

import org.apache.commons.lang3.time.StopWatch;
//...
Stopwatch stopwatch = new Stopwatch();
stopwatch.start();
// ...
stopwatch.stop();
long millis = stopwatch.getElapsedTime();
long nanos = stopwatch.getElapsedTime(TimeUnit.NANOSECONDS);
  • 可以通过suspend()和resume()方法暂停和恢复,因此可以使用相同的秒表实例来计算代码中不同部分的执行时间。在暂停和恢复之间的任何时间都不会计入总时间。
  • 可以通过createStarted()方法以启动模式创建,这样我们就不需要显式地调用start()方法了。
  • split()方法可以在秒表在后台继续运行时获取时间。unsplit()将消除split()的效果。
  • 它强制方法调用按正确的顺序进行,因此现在不能在start之前调用stop,在suspend之前调用resume,或在split之前调用unsplit。

但请注意,这个秒表不是线程安全的。

3. 结论

这篇简短的Java教程讨论了如何在Java中实现和使用秒表功能。我们为简单的用例创建了一个自定义的最基础秒表实现。对于高级用例,我们应该使用Apache Commons StopWatch类。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/12895.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】