Java - alternative zu thread.schlafen
Habe ich eine Anforderung zum anhalten einer while-Schleife für eine bestimmte Anzahl von Millisekunden. Ich habe versucht, mit Gewinde.sleep(Dauer), aber es ist nicht korrekt, vor allem in einer Schleife Szenario. Millisekunden-Genauigkeit ist wichtig, in mein Programm.
Hier ist der Algorithmus, wo ich nicht wollen, um zurück zu überprüfen Zustand bis expectedElapsedTime
übergeben hat.
while (condition) {
time = System.currentTimeMillis();
//do something
if (elapsedTime(time) < expectedElapsedTime) ) {
pause the loop //NEED SUBSTITUTE FOR Thread.sleep()
}
//Alternative that I have tried but not giving good results is
while ((elapsedTime(time) < expectedElapsedTime)) {
//do nothing
}
}
long elapsedTime(long time) {
long diff = System.currentTimeMillis() - time;
return diff;
}
InformationsquelleAutor user1189747 | 2012-02-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, eine ScheduledThreadPoolExecutor. Es soll mehr geben zuverlässige timing-Ergebnisse.
Wie unterstützt die Verwendung eines ScheduledThreadPoolExecutor ihm helfen, pause seine while-Schleife?
Es muss nicht, aber es löst das eigentliche Anforderung der arbeiten an einer genauen Abständen.
Danke für die Anregung. Ich geben diesem einen Versuch.
Hier ist der code, den ich versuchte, mit ScheduledThreadPoolExecutor. Es ist eine Art von einem schmutzigen Weg zum anhalten der loop, aber würde gerne wissen, ob es etwas falsch mit ihm, denn die pause ist nicht korrekt. while (<Bedingung>) { dummycounter = 10; //Dies sollte anhalten der loop für dummyCounter millisec -- nicht arbeiten Testamentsvollstrecker.Zeitplan((new Runnable (){public void run() { }}),dummyCounter,TimeUnit.MILLISEKUNDEN); }
InformationsquelleAutor Bill
Was erwarten Sie?
Wenn Sie schlafen gehen dann, sobald der Prozess wieder lauffähige es wird warten müssen, für den thread-scheduler, um wieder einplanen.
Ich meine, wenn Sie schlafen gehen für 50 Sekunden, dass bedeutet nicht, dass Ihr Prozess ausgeführt werden, in genau 50 Sekunden.Weil ater er wacht auf und ist ausführbar, es wird warten müssen eingeplant werden, um die CPU-was Zeit kostet plus die Zeit, die Sie für den Kontext wechseln.
Gibt es nichts, was Sie tun können, um es zu kontrollieren, so dass Sie können nicht die Genauigkeit, die Sie sagen.
Für deinen Fall würde ich vorschlagen, ein spinning-loop statt.
Ein Spinning-Schleife, um alle Prozessor ...
natürlich wird es wastecycles.Aber es wird auf jeden Fall nicht für lange.Er sagt Millisekunden
thread ist keine option, da Sie den overhead des kontextwechsels (ganz Liste)
Wie ich schon erwähnt hatte in meinem ursprünglichen code zu posten, hatte ich versucht, diese option, es gibt bessere Ergebnisse als Thread.Schlaf, aber es geht ein bisschen off-paar mal.
InformationsquelleAutor Cratylus
Java ist kein Echtzeit-system, können Sie nicht machen einen thread gehen Weg und kommen wieder auf so einem engen Zeitplan. Planen Sie Ihre Ausführung des Programms nach unten zur Millisekunde müssen Sie mit einer anderen Plattform - wie simpleRTJ oder Java-Echtzeit-Erweiterung.
InformationsquelleAutor jprusakova
Die Verzögerung ist wahrscheinlich willkürlich gewählt werden, so würde ich die Frage brauchen, um Echtzeit-Intervall timing.
Wenn Sie brauchen, Lesen Sie Zeit, die Sie brauchen, um beschäftigt warten, bis die Zeit erreicht. Dass der CPU bedeutet, Sie können nicht garantieren, dass Sie bekommen es zurück, genau dann, Wann Sie wollen.
InformationsquelleAutor Peter Lawrey
Du implementieren könntest wait/notify-Mechanismus und die Delegierten zu einem anderen thread in der Verantwortung des hat den anderen thread im wait-Zustand, dass die Menge an Zeit ist vergangen und es kann weiter gehen ...
Zum Beispiel, wenn die threadA warten müssen, für eine gewisse Zeit kann man den thread in den wait-Zustand und startet einen timer-task, der nach einer bestimmten Zeit (Intervall ) - Aufruf informieren und wecken den ThreadA, gehen Sie vor, dies könnte eine alternative sein .
waits
dann ist es im gesperrten Zustand.Dies bedeutet Kontextwechsel was bedeutet, dass zusätzliche Zeit, die, wie ich verstehe, die OP, die er nicht will, strenge PräzisionDies könnte eine alternative sein, ich weiß nicht, ob es genauer ist oder nicht, sollte getestet werden ...
Ich habe versucht, diese.warten(millisec,nanosec) , es ist keiner besser als der Thread.schlafen.
Auch lese ich habe versucht, die Lösung müssen Sie ein daemon-thread, wie empfohlen, in stackoverflow.com/questions/824110/....
Auch lese ich habe versucht, die Lösung müssen Sie ein daemon-thread, wie empfohlen, in stackoverflow.com/questions/824110/....
InformationsquelleAutor aleroot
Wenn Sie wollen, um genau zu sein mit sounds, die Sie verwenden, einen Sequenzer und das tempo in BPM:
sequencer.setTempoInBPM(120);
InformationsquelleAutor user1938065
Die Lösung ist eine Prozedur mit einem runnable und Verwendung der Methode 'postDelayed'. Beispiel:
https://stackoverflow.com/a/21680858
InformationsquelleAutor Android Freaks
Vergessen Sie nicht über garbage-collector Pausen. Es können alle schlagen Ihre Pläne
InformationsquelleAutor