我有一个持续时间字段跟踪Runnable中当前每分钟循环的经过时间(以分钟为单位)。我想让它每秒运行一次循环,但我的检查会多次启动。以下是我的代码的要点。
Runnable runnable = (new Runnable() {
@Override
public void run() {
Instant now = Instant.now();
Duration timeElapsed = Duration.between(start, now);
long elapsedMinutes = timeElapsed.toMinutes();
if (elapsedMinutes == (int) (totalRuntime() * .75)) {
// Do something when partially done.
// When set to second loops, this would run 60-ish times.
}
}
});
我尝试添加支票,基本如下,查看秒数除以60是否为整数,但这也没有效果。
long elapsedSeconds = timeElapsed.getSeconds();
if (elapsedSeconds / 60 == Math.round(elapsedSeconds / 60)) {
// Then do other stuff
}
有人可以建议我可以做的事情,以确保循环中的所有内容每分钟只运行一次,而不是每秒运行一次。
你也可能会问我为什么要把它变成秒而不是分钟,因为有一个if语句包含整个run
方法而且它必须如果它没有通过就立即开始。
答案 0 :(得分:0)
计时器怎么样?
class CheckYourStuff extends TimerTask {
public void run(){
//do stuff
}
}
从软件中的另一点
Timer t = new Timer();
timer.schedule(new CheckYourStuff(),0,1000);
否则我会建立一个执行人并给他一个时间表:example code
答案 1 :(得分:0)
private double last = 0;
public void SomeMethod() {
double now = System.currentTimeMillis() / 1000;
if(now - last >= 60) {
//do stuff
last = System.currentTimeMillis() / 1000;
}
}
每60秒就会运行一次。为了获得更好的精度,您可以使用System.nanoTime(),但这比currentTimeMillis()更昂贵。
答案 2 :(得分:-1)
我认为你要找的是Timer类:
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("A second has passed");
}
}, 1000, 1000);
Timer timerMin = new Timer();
timerMin.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("A minute has passed");
}
}, 60_000, 60_000);