Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向stopwatch类添加暂停和恢复方法_Java - Fatal编程技术网

Java 向stopwatch类添加暂停和恢复方法

Java 向stopwatch类添加暂停和恢复方法,java,Java,如何将pause和resume方法添加到此类? 当您暂停并且它已经暂停时,则不应发生任何事情。 此外,如果您在未暂停时继续,则不会发生任何事情 public class Stopwatch { private final long start; public Stopwatch() { start = System.currentTimeMillis();} public double elapsedTime() { long now = System.curre

如何将pause和resume方法添加到此类? 当您暂停并且它已经暂停时,则不应发生任何事情。 此外,如果您在未暂停时继续,则不会发生任何事情

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

  }
}
公共类秒表{
私人最终长期启动;
公众秒表{
start=System.currentTimeMillis();}
公共双elapsedTime(){
long now=System.currentTimeMillis();
return(现在开始)/1000.0;}
公共静态void main(字符串[]args){
秒表=新秒表();
双倍合计=0.0;
对于(int i=0;i<100000000;i++)
总数+=数学随机数();
双倍时间=watch.elapsedTime();
打印时间;
}
}

为什么不保存一个变量
累计时间
,当调用
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
布尔值
实例变量?然后您的
pause()/resume()
可以在适当的情况下做出响应 e、 g.在
pause()
方法中:

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

暂停时间存储在additionaltime变量中,当调用elapsedTime时,这将用于删除暂停时间。PauseStart变量在调用暂停时存储(在resume调用后,计算额外时间)


看起来您的秒表当前与系统时间(System.currentTimeMillis())绑定,因此要暂停应用程序,您需要从经过的时间中减去暂停的时间
不过,您可以节省暂停时钟的时间以及时钟恢复的时间:

pause() {
  if(!alreadyPaused)
    timePaused = System.currentTimeMillis();
}
resume() {
  timeResumed = System.currentTimeMillis();
  totalTimePaused = previousPausedTimes + (timeResumed-timePaused);
}
然后在您的elapsedTime()中:


非常感谢。当我调用watch.pause()然后显示watch.elapsedTime()时,它会工作。但是当我稍后显示watch.elapsedTime()而不再暂停时,时间已经改变了。。。你的问题答案是什么?
pause() {
  if(!alreadyPaused)
    timePaused = System.currentTimeMillis();
}
resume() {
  timeResumed = System.currentTimeMillis();
  totalTimePaused = previousPausedTimes + (timeResumed-timePaused);
}
  public double elapsedTime() {
    long now = System.currentTimeMillis();
    return (now - start - totalTimePaused) / 1000.0;
  }