Java 向stopwatch类添加暂停和恢复方法
如何将pause和resume方法添加到此类? 当您暂停并且它已经暂停时,则不应发生任何事情。 此外,如果您在未暂停时继续,则不会发生任何事情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
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;
}