Java-Schleife für eine bestimmte Dauer
Gibt es eine Möglichkeit, kann ich eine for-Schleife für eine gewisse Zeit einfach? (ohne Messung der Zeit, die uns mit System.currentTimeMillis() ?)
I. e. Ich will etwas tun, wie dieses in Java:
int x = 0;
for( 2 minutes ) {
System.out.println(x++);
}
Dank
Wollen Sie kontinuierlich und wütend etwas drucken, auf dem Bildschirm für die Dauer von 2 Minuten? Oder Sie drucken möchten, die einmal alle 2 Minuten?
Ich will kontinuierlich und wütend etwas drucken, auf dem Bildschirm für die Dauer von 2 Minuten
Die meisten Antworten sind völlig falsch zu sagen Sie nicht tun können, ohne die Messung der Zeit selbst. Sie auf jeden Fall KANN tun Sie es, ohne mit System.currentTimeMillis(). Sie zum Beispiel könnte planen Sie einen Timer auf zwei Minuten eingestellt, ändern würde eine volatile boolean (sagen wir shouldStop) und while(!shouldStop) {...} aber wirklich für etwas, dass einfach ich sehe nicht, was falsch mit der Verwendung von System.currentTimeMillis() (beachten Sie, dass, auch wenn ich lieber System.currentTimeMillis() ändert nicht den Tatsache, dass die meisten Antworten sind völlig falsch und Unrecht von Ihnen positiv bewertet werden).
Btw Java nicht als real-time-es gibt keine Garantie, selbst ständig überprüfen, System.currentTimeMillis(), dass Sie werde in der Lage sein zu laufen für genau zwei Minuten: dein thread sehr wütend prüfen der Zeit bekommen könnte "geplante out" und können Sie "miss", die "exakte" zwei-Minuten-spot wie auch immer, so argumentieren Sie, dass ein Timer kann daneben wäre ziemlich verzögert, weil ein thread ständig überprüfen, System.currentTimeMillis() könnte daneben auch 🙂
Oh WizardOfOdds, so leidenschaftlich, so wütend. Ich habe einen Freund für Sie.
Ich will kontinuierlich und wütend etwas drucken, auf dem Bildschirm für die Dauer von 2 Minuten
Die meisten Antworten sind völlig falsch zu sagen Sie nicht tun können, ohne die Messung der Zeit selbst. Sie auf jeden Fall KANN tun Sie es, ohne mit System.currentTimeMillis(). Sie zum Beispiel könnte planen Sie einen Timer auf zwei Minuten eingestellt, ändern würde eine volatile boolean (sagen wir shouldStop) und while(!shouldStop) {...} aber wirklich für etwas, dass einfach ich sehe nicht, was falsch mit der Verwendung von System.currentTimeMillis() (beachten Sie, dass, auch wenn ich lieber System.currentTimeMillis() ändert nicht den Tatsache, dass die meisten Antworten sind völlig falsch und Unrecht von Ihnen positiv bewertet werden).
Btw Java nicht als real-time-es gibt keine Garantie, selbst ständig überprüfen, System.currentTimeMillis(), dass Sie werde in der Lage sein zu laufen für genau zwei Minuten: dein thread sehr wütend prüfen der Zeit bekommen könnte "geplante out" und können Sie "miss", die "exakte" zwei-Minuten-spot wie auch immer, so argumentieren Sie, dass ein Timer kann daneben wäre ziemlich verzögert, weil ein thread ständig überprüfen, System.currentTimeMillis() könnte daneben auch 🙂
Oh WizardOfOdds, so leidenschaftlich, so wütend. Ich habe einen Freund für Sie.
InformationsquelleAutor portoalet | 2010-03-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, es ist nicht ein eingebautes Konstrukt, welches das tut.
Möchte ich darauf hinweisen, dass Sie, sollten Sie nicht verwenden System.currentTimeMillis() for performing, oder zu verzögern, eine Aufgabe, für einen bestimmten Zeitraum. Verwenden Sie stattdessen System.nanoTime(). Die erstere Methode ist ungenau, in Windows, während die letztere Methode ist präzise, unabhängig von OS. Sie können TimeUnit enum zu leicht gehen Sie von der Zeit in Millisekunden, oder jede andere Zeit-Einheit, um die Zeit in Nanosekunden.
Oh Nein. Mit Nanosekunden macht es NICHT gültig, um Verschwendung von CPU-Zyklen! Nie eine Schleife Programmieren, überwachen Sie die Zeit und tun Sie - nichts! Stattdessen: verwenden Sie Thread.sleep(...) erlauben das system zu tun nützlich Dinge, während Sie nicht wollen, nichts von ihm!!
Der OP will etwas nützliches tun, während diese Schleife, daher der Kommentar, den ich gesetzt in die Schleife. @portoalet - ich bin nicht sicher, es ruft nur die high-resolution-timer im Gegensatz zu anderen timer. Also es sollte die gleiche wie das System.currentTimeMillis.
Nun, es ist wahr, dass
System.currentTimeMillis()
hat eine gröbere Auflösung alsnanoTime()
, aber es ist immer noch ~10-15ms. Also, wenn Sie wollen, Messen im ms-Bereich,System.currentTimeMillis()
ist vollkommen OK. Auch ich denke, dassSystem.currentTimeMillis()
ist etwas schneller als dienanoTime()
(obwohl dies hängt von der JVM und wird in der Regel nicht einen Unterschied machen).Dies könnte nützlich sein in bestimmten Umständen, wie beispielsweise Performance-Lasttests schieben wir innerhalb der Schleife
InformationsquelleAutor Tim Bender
Ich denke, dass das ist, was Sie wollen:
Dies vermeidet dabei wiederholt Aufrufe, um das system-clock-Wert (die können sehr teuer sein) und fragt die aktuellen Threads
interrupted
Flagge statt (viel billiger).BEARBEITEN
Gibt es eigentlich keinen sicher alternative zum polling-die-Uhr-oder polling-flag. In der Theorie könnten Sie ändern das obige Beispiel zu nennen, die veraltet
Thread.stop()
Methode stattThread.interrupt()
.(Ich weiß NICHT empfehlen
Thread.stop()
und Freunde. Sie sind falsch, und gefährlich zu benutzen. Ich bin einfach nur posiert diese als theoretische alternative.)EDIT 2
Nur darauf hinweisen, dass mit
Thread.interrupt()
hat die Vorteile gegenüber der Einstellung einer gemeinsamen Flagge:Thread.interrupt() führt dazu, dass bestimmte blockierende I/O und Synchronisation Methoden, um die Blockierung aufheben und werfen einer checked exception. Die Aktualisierung eines freigegebenen flag wird das nicht mehr tun.
Einige Drittanbieter-Bibliotheken überprüfen Sie auch das interrupt-flag, um zu sehen, wenn Sie sollten aufhören, was Sie gerade tun.
Wenn Ihr loop beinhaltet Anrufe zu anderen Methoden, etc, Thread.interrupt() bedeutet, dass Sie nicht brauchen, um über diese Methoden können auf die Flagge..., wenn Sie brauchen.
EDIT 3
Nur hinzuzufügen, dass
sleep(N)
ist nicht garantiert, wecken den schlafenden thread nach genauN
Millisekunden. Aber unter normalen Umständen, wird es ziemlich nahe sein.InformationsquelleAutor Stephen C
Habe ich ein einfaches, aber sucky, Umsetzung für dieses problem. Ich wollte vermeiden, Timer und TimeTask und landete mit dieser quickfix-Lösung.
Die Grundidee ist die, dass ich wollte einfach erstellen Sie eine unabhängig countdown-timer, ich konnte einfach start-und call-isFinished() um zu prüfen, ob der countdown beendet ist.
InformationsquelleAutor Endre Vestbø
Hier eine Anregung:
run()
Methode, da es die potenziell verbrauchen alle Ihre CPU-Leistung.TimerLoop
Klasse für jedeRunnable
, die Sie ausführen möchten.InformationsquelleAutor matsev
Nicht. Das ist irgendwie eine seltsame Anfrage, wenn man bedenkt, wie einfach es wäre zu einfach eine Funktion schreiben, die das System.currentTimeMillis() (oder je nachdem, was Zeit-Funktion, die Sie wählen). Mehr Kontext, die situation könnte in Ordnung sein.
tatsächlich, ruft
System.currentTimeMillis()
kann sehr teuer sein. Auf einigen Plattformen wird es bedeuten, bilden Sie ein system-call; d.h. Hunderte von Maschinen-Anweisungen.-1 - das ist nicht eine dumme Frage überhaupt.
C, ich habe nie gesagt, es war dumm
Seltsame Anfrage bedeutet nicht, dumme Frage? Wenn du das so sagst ... so oder so, "Nein" ist eindeutig eine falsche Antwort.
InformationsquelleAutor Joe Phillips
Ich glaube nicht, dass es einen Weg gibt, um eine Schleife für einen bestimmten Zeitraum, ohne zu überprüfen, um zu sehen, ob Sie haben geloopt für einen bestimmten Zeitraum.
Auch jemand, irgendwo, hat um die Zeit zu überprüfen. Selbst wenn Sie eine ScheduledFuture oder TimerTask oder sogar ein Quarz-Komponente, im code gibt es ein timing-Mechanismus für sicher.
nicht unbedingt. Auf Windows und Linux die C-Schlaf-Bibliothek-Funktion ist implementiert als ein Systemaufruf; siehe cboard.cprogramming.com/c-programming/... . Und ich erwarte, dass Java-Thread.sleep(...) ruft die C-library-Funktion unter der Decke.
natürlich ist das schlafen syscall-hat "etwas zu tun mit der Zeit". Aber der Mechanismus ist nicht in den code von
ScheduledFuture
etc. Es ist in der OS-kernel. Und das wird es ganz sicher nicht NICHT bringen "überprüfen, um zu sehen, wenn Sie haben geloopt für einen bestimmten Zeitraum von Zeit".BTW, ich markiert deinen Kommentar als beleidigend. Freundlicherweise unterlassen, was bedeutet, dass ich illegale Drogen nehmen.
InformationsquelleAutor
Je nach Anwendungsfall entweder die beiden schlafen () - Methoden in der Klasse Thread könnte passen die Rechnung, aber es klingt wie Sie haben, um Aufhebens mit dem System.currentTimeMillis(), das scheint seltsam.
InformationsquelleAutor Jim Ferrans
Schleifen iterieren über Wert-Vergleich und nicht für Dauer. So, ohne selbst die Zuordnung und den Vergleich der system-Zeit, das können Sie nicht.
Wenn Sie jedoch wünschen, die es intuitiv haben, können Sie eine Funktion, die intern verwendet Millisekunden, aber es dauert Minuten, als argument und verwenden Sie es.
Und Nein, Sie können nicht Fäden oder die sleep-Methode, da Sie nicht gewährleisten die exakte Zeit an. Wenn der Prozessor damit beschäftigt ist mit einem anderen thread nach der angegebenen Zeit abgelaufen ist, dann ist dein thread wird weiterhin warten.
InformationsquelleAutor Vaishak Suresh