我试图通过使用 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 时再次运行。

请您参考如下方法:

如果你想忙着等待秒数改变你可以使用下面的。

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

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

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

这种方法的优点是

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


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!