每秒重复循环一次

时间:2013-11-26 23:28:21

标签: java while-loop

我有一个需要每秒重复一次的while循环,我不知道该怎么做。我甚至从未使用过Java的时间模块或其他任何模块。

基本循环如下所示。谁能给我一个如何做到这一点的小费?

while (!isOver()) {
   // do some work
}

5 个答案:

答案 0 :(得分:5)

也许这段代码可以帮到你。这是一个预定的时间任务,每1秒重复一次run()方法。你可以添加你想要的任何东西。

TimerTask timerTask = new TimerTask() 
{ 
    public void run()  
    { 
         .... //Whatever inside your loop will be executed every second
    } 
}; 

.... 

Timer timer = new Timer(); 
timer.scheduleAtFixedRate(timerTask, 0, 1000);

希望它有所帮助! :)

答案 1 :(得分:2)

以下情况可以。

while (!isOver()) {
    // do some work
    try {
        Thread.sleep(1000); /* 1000ms or 1 second */   
    } catch(InterruptedException e) {
        // handle
    }
}

答案 2 :(得分:2)

我可能会使用一个线程,虽然取决于你的计算机有多快,以及它需要为循环的每次迭代做多少工作,但它可能并不完美。

每个程序始终有一个线程。如果没有,那就不是一个过程。这是你的主线程,当你的程序启动时它会“生命”,当程序终止时会死掉。 Thread上有一个名为sleep(int ms)的静态方法。这将暂停线程的处理,直到它的参数(ms)毫秒已经过去。所以Thread.sleep(1000)将暂停该线程一秒钟,然后恢复。

每次暂停主线程一秒钟如下:

while(!isOver()) {
    // Do stuff
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
            // Deal with exception here
    }
}

希望这会有所帮助。还有另一种创建线程的方法,但是为了这个目的,它太长了并且已经抽出来了。

PS你需要try / catch,因为有时系统会中断你的线程,这会导致异常。一个简单的e.printStackTrace()可以让你知道它何时发生,但你可能想要更明确地为任何生产应用程序处理它。

答案 3 :(得分:0)

private void time() {
    while (! isOver) {
        try {
            Thread.sleep(1000);
        }
        catch (InterruptedException e) {
            //Do nothing, just loop
        }
    }
}

然后在另一个线程上启动它,这样你的主线程就会继续:

new Thread(this::time).start();

答案 4 :(得分:0)

正如您所看到的,有很多方法可以实现您的目标。这是另一种方式。如果您的代码可以抛出异常,我倾向于回避计时器,因为它会阻止Timer再次运行。像这样的东西可以减少一些问题。

ScheduledExecutorService e = Executors.newSingleThreadScheduledExecutor();

e.scheduleAtFixedRate(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub

        }

    }, 0, 1, TimeUnit.SECONDS);
}

或者如果你想睡觉,你可以尝试:

while(!isOver) {
  //DO WORK

  try {
    //Be careful if you are holding any Locks they will not be released
    TimeUnit.SECONDS.sleep(1);
  } catch (InterruptedException e) {
        //Do nothing, just loop
  }
}