我试图通过使用 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();
这种方法的优点是
- 您可以让多个不同时期的任务共享同一个线程。
- 您可以有非重复延迟或异步任务。
- 您可以在另一个线程中收集结果。
- 您可以通过一条命令关闭线程池。