首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向stopwatch类添加pause和resume方法

向stopwatch类添加pause和resume方法
EN

Stack Overflow用户
提问于 2019-11-22 05:04:00
回答 3查看 122关注 0票数 0

如何向该类添加pause和resume方法?当你暂停的时候,它已经暂停了,那么不应该发生任何事情。此外,如果您在未暂停时恢复,则不会发生任何事情。

代码语言:javascript
复制
public class Stopwatch {
  private final long start;

  public Stopwatch() {
    start = System.currentTimeMillis();}

  public double elapsedTime() {
    long now = System.currentTimeMillis();
    return (now - start) / 1000.0;}

  public static void main(String[] args) {
    Stopwatch watch = new Stopwatch();
    double total = 0.0;

    for (int i = 0; i < 100000000; i++) 
      total += Math.random();

    double time = watch.elapsedTime();

    StdOut.println(time);

  }
}
EN

回答 3

Stack Overflow用户

发布于 2019-11-22 05:19:51

为什么不保存一个变量accumulatedTime,并在调用pause()方法时将累积时间附加到该变量

代码语言:javascript
复制
accumulatedTime += System.currentTimeMillis() - start / 1000.0;

当调用resume()时,您可以重置start

代码语言:javascript
复制
start = System.currentTimeMillis();

然后elapsedTime()会添加两个:

代码语言:javascript
复制
public double elapsedTime() {
   long now = System.currentTimeMillis();
   return ((now - start) / 1000.0) + accumulatedTime;
}

您还需要跟踪暂停状态-也许是一个isPaused boolean实例变量?然后,您的pause()/resume()可以在适当的情况下响应,例如在pause()方法中:

代码语言:javascript
复制
if (isPaused) {
   return;   //do nothing
}
票数 0
EN

Stack Overflow用户

发布于 2019-11-22 05:20:14

暂停时间存储在additionaltime变量中,当调用elapsedTime时,该变量将用于删除暂停时间。PauseStart变量存储调用暂停的时间(在恢复调用之后,会计算附加时间)

代码语言:javascript
复制
private long additionalTime;

private long pauseStart;

public void pause() {
    if (pauseStart == 0) {
        pauseStart = System.currentTimeMillis();
    }
}

public void resume() {
    if (pauseStart != 0) {

        long stopTime = System.currentTimeMillis() - pauseStart;

        additionalTime += stopTime;

        pauseStart = 0;
    }
}

public double elapsedTime() {
    long now = System.currentTimeMillis();

    if (pauseStart != 0) {

        long stopTime = System.currentTimeMillis() - pauseStart;

        additionalTime += stopTime;

        pauseStart = 0;
    }

    return ((now - start) - additionalTime) / 1000.0;
}
票数 0
EN

Stack Overflow用户

发布于 2019-11-22 05:20:29

看起来您的秒表当前与系统时间(System.currentTimeMillis())相关联,因此要暂停应用程序,您需要从已用时间中减去暂停的时间

不过,您可以做的是保存暂停时钟的时间以及恢复时钟的时间:

代码语言:javascript
复制
pause() {
  if(!alreadyPaused)
    timePaused = System.currentTimeMillis();
}
resume() {
  timeResumed = System.currentTimeMillis();
  totalTimePaused = previousPausedTimes + (timeResumed-timePaused);
}

然后在您的elapsedTime()中:

代码语言:javascript
复制
  public double elapsedTime() {
    long now = System.currentTimeMillis();
    return (now - start - totalTimePaused) / 1000.0;
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58983710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档