使用System.currentTimeMillis()每秒运行代码

时间:2012-10-29 12:43:48

标签: java loops time

我试图通过使用System.currentTimeMillis();每秒运行一行代码。

代码:

     while(true){
           long var = System.currentTimeMillis() / 1000;
           double var2 = var %2;

           if(var2 == 1.0){

               //code to run

           }//If():

        }//While

我想运行的代码运行多次,因为var2被设置为1.0多次,因为无限的整个循环。我只想在var2首次设置为1.0时运行代码行,然后每当var2在0.0之后变为1.0时再次运行。

5 个答案:

答案 0 :(得分:15)

如果您想忙等待更改秒数,可以使用以下内容。

long lastSec = 0;
while(true){
    long sec = System.currentTimeMillis() / 1000;
    if (sec != lastSec) {
       //code to run
       lastSec = sec;
    }//If():
}//While

更有效的方法是睡到下一秒。

while(true) {
    long millis = System.currentTimeMillis();
    //code to run
    Thread.sleep(1000 - millis % 1000);
}//While

另一种方法是使用ScheduledExecutorService

ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();

ses.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        // code to run
    }
}, 0, 1, TimeUnit.SECONDS);

// when finished
ses.shutdown();

这种方法的优点是

  • 您可以使用不同时段共享同一个帖子的多个任务。
  • 您可以进行非重复延迟或异步任务。
  • 您可以在另一个帖子中收集结果。
  • 您可以使用一个命令关闭线程池。

答案 1 :(得分:3)

我使用java executor库。您可以创建一个可以运行的ScheduledPool,并且可以运行您想要的任何时间段。例如

Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(new MyRunnable(), 0, 5, TimeUnit.SECONDS);

每5秒运行一次MyRunnable类。 MyRunnable必须实现Runnable。这样做的问题在于它每次都会(有效地)创建一个新的线程,这可能是也可能不是。

答案 2 :(得分:2)

您必须使用java.util.Timerjava.util.TimerTask类。

答案 3 :(得分:1)

使用Thread.sleep();非常适合您的情况。

 while(true)
 {
    Thread.sleep(1000); // Waiting before run.
    // Actual work goes here.
 }

答案 4 :(得分:1)

首选方式:

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

然后传入Runnables,如:

scheduler.scheduleWithFixedDelay(myRunnable, initDelay, delay, TimeUnit.MILLISECONDS);

我不会使用Timer。调度程序用于处理计时器可能导致的问题。此外,Thread.sleep适用于一个简单的程序,你可以快速编写概念类型的东西,但我不会在企业界使用它。