我试图通过使用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时再次运行。
答案 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.Timer和java.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适用于一个简单的程序,你可以快速编写概念类型的东西,但我不会在企业界使用它。