2016-06-06 7 views
0

У меня есть длительность отслеживания полей длительности (в минутах) в Runnable, которая в настоящее время проходит каждую минуту. Я хочу, чтобы он запускал цикл каждую секунду вместо этого, но мои проверки срабатывают несколько раз. Ниже приведен сущность моего кода.Продолжительность # toMinutes в Runnable Each Second

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-statement, обертывающий весь метод run, и он должен что-то начать немедленно, если он не пройдет.

ответ

-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); 
+0

Это не проблема. Моя петля работает отлично. – Spedwards

+0

@Spedwards Я его отредактировал. Вы можете запланировать два таймера, которые выполняются каждую секунду, и одну, которая выполняется каждую минуту. – explv

0

насчет таймера?

class CheckYourStuff extends TimerTask { 
    public void run(){ 
     //do stuff 
    } 
} 

с другой точкой в ​​вашей программе

Timer t = new Timer(); 
timer.schedule(new CheckYourStuff(),0,1000); 

В противном случае я бы построить Исполнитель и дать ему расписание: example code

+0

Опять же, это не проблема. Цикл работает отлично. – Spedwards

+0

Действительно, так оно и есть. Если вы хотите сохранить код, который вы написали: откуда происходит 'totalRuntime()'? Что вы подразумеваете под «срабатыванием многократного срабатывания»? Другое дело: вы перевернули «вторую» и «минуту» во втором и последнем предложении? – Vale

+0

totalRuntime() получает общую продолжительность для его запуска до сброса. В настоящее время он возвращает 60. – Spedwards

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