2016-06-06 11 views
0

Ich habe eine Dauer Feldverfolgung verstrichene Zeit (in Minuten) in einem Runnable, die derzeit jede Minute Loops. Ich möchte, dass es stattdessen jede Sekunde die Schleife ausführt, aber meine Schecks feuern mehrmals ab. Unten ist der Kern meines Codes.Dauer # toMinutes in Runnable jede Sekunde

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. 
     } 
    } 
}); 

Ich habe versucht, einen Scheck hinzufügen, im Grunde wie folgt, zu sehen, ob die durch 60 geteilt Sekunden eine ganze Zahl war, obwohl das auch nicht funktioniert hat.

Kann jemand vorschlagen, was ich tun kann, um sicherzustellen, dass alles in der Schleife nur einmal pro Minute statt einmal pro Sekunde ausgeführt wird.

Sie können auch fragen, warum ich es eine Sekunde statt Minute mache, ist es, weil es eine if-Anweisung gibt, die die gesamte run Methode einwickelt, und es muss etwas sofort starten, wenn es nicht besteht.

Antwort

-1

Ich denke, was Sie suchen die Timer-Klasse ist:

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

Dies ist nicht das Problem. Meine Schleife läuft einwandfrei. – Spedwards

+0

@Spedwards Ich habe es bearbeitet. Sie können zwei Timer programmieren, die jede Sekunde ausgeführt werden und eine, die jede Minute ausgeführt wird. – explv

0

Was ist mit einem Timer?

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

von einem anderen Punkt in der Software

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

Sonst würde ich einen Executor bauen und ihm den Zeitplan geben: example code

+0

Auch dies ist nicht das Problem. Die Schleife läuft einwandfrei. – Spedwards

+0

Tatsächlich tut es das. Wenn du den Code, den du geschrieben hast, behalten willst: Woher kommt 'totalRuntime()'? Was meinst du mit "mehrmals abfeuern"? Eine andere Sache: hast du "Sekunde" und "Minute" im vorletzten Satz invertiert? – Vale

+0

totalRuntime() ruft die Gesamtdauer ab, die vor dem Zurücksetzen ausgeführt werden soll. Es gibt zur Zeit 60 zurück. – Spedwards

0
private double last = 0; 

public void SomeMethod() { 
    double now = System.currentTimeMillis()/1000; 
    if(now - last >= 60) { 
     //do stuff 
     last = System.currentTimeMillis()/1000; 
    } 
} 

Sie laufen Sachen einmal alle 60 Sekunden. Für eine bessere Genauigkeit können Sie System.nanoTime() verwenden, aber das ist teurer als currentTimeMillis().

Verwandte Themen