向秒表类添加暂停和继续方法

时间:2019-11-21 21:03:59

标签: java

如何为此类添加暂停和恢复方法? 当您暂停并且已经暂停时,则不会发生任何事情。 另外,如果您在不暂停的情况下恢复播放,则不会发生任何事情。

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);

  }
}

3 个答案:

答案 0 :(得分:0)

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

accumulatedTime += System.currentTimeMillis() - start / 1000.0;

调用resume()时,您可以重置开始

start = System.currentTimeMillis();

然后elapsedTime()会添加两个:

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

您还需要跟踪暂停状态-也许是isPaused boolean实例变量?然后您的pause()/resume()可以在适当的时候回复 例如在pause()方法中:

if (isPaused) {
   return;   //do nothing
}

答案 1 :(得分:0)

已暂停时间存储在Additionaltime变量中,当称为elapsedTime时,它将用于删除暂停时间。 PauseStart变量存储调用暂停的时间(恢复调用后将计算额外时间)

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;
}

答案 2 :(得分:0)

您的秒表当前与系统时间(System.currentTimeMillis())相关联,因此要暂停应用程序,您需要以某种方式从经过的时间中减去暂停的时间
不过,您可以做的是节省暂停时钟的时间以及恢复时钟的时间:

pause() {
  if(!alreadyPaused)
    timePaused = System.currentTimeMillis();
}
resume() {
  timeResumed = System.currentTimeMillis();
  totalTimePaused = previousPausedTimes + (timeResumed-timePaused);
}

,然后在您的elapsedTime()中:

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