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

2022-09-04 06:32:36

我试图使用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时运行代码行,然后在0.0之后var2变为1.0时再次运行代码行。


答案 1

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

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

这种方法的优点是

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

答案 2

我会使用java执行器库。您可以创建一个计划池,该池需要可运行,并且可以运行所需的任何时间段。例如

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

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


推荐