java中的计时器实现

时间:2015-08-24 19:14:28

标签: java timer

一个程序,提示用户输入秒数,然后每秒显示一条消息,并在时间到期时终止。到目前为止,我已经能够做到这一点。但是,我被困在这里。

public static void main(String[] args) 
    {
    Scanner r = new Scanner(System.in); 
        int sec = r.nextInt(); 
        while (sec > 0)
        { 
            System.out.println("Seconds Remaining" + sec); 
            /**What to do here using System.currentTimeMillis()??**/ 
            sec--;
        }
}

2 个答案:

答案 0 :(得分:3)

你正在寻找Thread.sleep()或TimeUnit.sleep我怀疑

public static void main(String[] args) throws InterruptedException {
    Scanner in = new Scanner(System.in); 
    for(int sec = in.nextInt(); sec > 0; sec --) {
        System.out.println("Seconds Remaining " + sec); 
        TimeUnit.SECONDS.sleep(1);
    }
}

答案 1 :(得分:3)

从“我怎样才能在选定的方法中使用(使用currentTimeMillis),这对于学习有一些价值,以便下次我需要做类似的事情,这是正确的方式,我不会卡住了,尽管这次不是最好的方式“观点:

long start = System.currentTimeMillis();
long now = System.currentTimeMillis();
while (now - start > 1000) // While the difference between the two times is less than a second
{
    now = System.currentTimeMillis();
}

你甚至可以尝试纠正错误(now-start-1000毕竟可能大于1,那将是失去的时间)并计算任何多余的时间。然后,您将获取该超出部分并从循环的条件中的1000中减去它,以便下次您只需稍等一点时间来弥补上次的超出部分。此外,System.out.println()需要时间,因此您需要在System.out.println之前设置开始,以便更准确一些。

现在,希望我已经指出了足够的陷阱来证明为什么这对任何重要的计时都是一个坏主意。更准确的最简单方法是使用Timer使用线程,允许打印和其他开销从计时中分离出来。但是,它只是对上面使用的一个不太有趣但更简单的解释是Object.wait(),它“不提供实时保证”。