持续时间#toMinutes in Runnable每秒

时间:2016-06-06 10:43:19

标签: java runnable duration elapsedtime

我有一个持续时间字段跟踪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方法而且它必须如果它没有通过就立即开始。

3 个答案:

答案 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);