12

我正在尝试使用 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 时再次运行。

4

5 回答 5

22

如果您想忙于等待秒数更改,可以使用以下方法。

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

这种方法的优点是

  • 您可以让多个不同时期的任务共享同一个线程。
  • 你可以有非重复的延迟或异步任务。
  • 您可以在另一个线程中收集结果。
  • 您可以使用一个命令关闭线程池。
于 2012-10-29T12:53:04.800 回答
4

我会使用 java执行程序库。您可以创建一个ScheduledPool,它接受一个可运行的并且可以在您想要的任何时间段内运行。例如

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

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

于 2012-10-29T12:49:37.103 回答
2

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

于 2012-10-29T12:45:03.533 回答
2

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

 while(true)
 {
    Thread.sleep(1000); // Waiting before run.
    // Actual work goes here.
 }
于 2012-10-29T12:45:36.213 回答
1

首选方式:

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

然后传入 Runnables,如:

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

我不会使用定时器。调度程序旨在处理计时器可能导致的问题。此外,Thread.sleep 非常适合一个简单的程序,您可以快速编写该程序以用于概念证明类型的东西,但我不会在企业世界中使用它。

于 2012-10-29T12:52:36.663 回答