[Threads] sleep vs. Timer vs. ?
-
Hallo zusammen,
ich bin mir einfach nicht sicher, was die besste Lösung für folgendes Problem ist:
Es soll ca. alle 30 ms (oder irgend ein anderes Intervall) der Zustand der Simulation neu gezeichnet werden. Dabei kenne ich jetzt zwei Möglichkeiten:Thread.sleep() benutzen:
public void run() { while(true) { try { startTime=System.currentTimeMillis(); /* Zeichne alles */ endTime=System.currentTimeMillis(); if(endTime-startTime<30) Thread.sleep(30-endTime+startTime); } catch(...) {...} } }
java.util.Timer benutzen:
timer.schedule(task, 0, 30);
Allerdings kann ich bei letzterem nicht das Neuzeichnen anhand der Zeichendauer kontrollieren. Denn dauert das Zeichnen z.B. mittlerweile 60ms, dann soll nicht nochmal 30ms gewartet werden, sondern gleich neu gezeichnet. Es soll aber nicht schon wärend das erste Bild geszeichnen wird, das zweite angefangen werden. Gibt es noch eine andere, bessere Möglichkeit? Oder bin ich einfach auf dem falschen Dampfer?
Viele Grüße
Jan
-
Im Prinzip würde ich deinen Code so lassen, nur dass ich die Zeitnehmung etwas anders machen würde:
public void run() { long now = System.currentTimeMillis(); long lastFrameTime = now; while (true) { try { /* Zeichne alles */ now = System.currentTimeMillis(); long diff = now - lastFrameTime; lastFrameTime = now; if (diff < 30) Thread.sleep(30 - diff); } catch(...) {...} } }
Vermeidet 1. einen Aufruf von System.currentTimeMillis() und kommt 2. besser mit dem (ultra-seltenen, aber egal) Fall klar, wenn zwei unmittelbar aufeinanderfolgende Aufrufe von System.currentTimeMillis() unterschiedliche Zeiten liefern.
Evtl. Object.wait() statt Thread.sleep(), verwenden wenn du das Warten (z.B. bei Programmabbruch) schnell unterbrechen können willst - wobei das bei einem Intervall von 30ms vermutlich egal ist.
-
Wenn ich aber nur einmal System.currentTimeMillis() verwende, habe ich das Problem, dass ich die "Schlafenszeit" auch mit messe. (Wobei, man könnte die ja rausrechnen mit (lastFrameTime-(30-diff)).)
Wenn ich nun Thrad.sleep() in einer Schleife aufrufe, sagt mir NetBeans: Invoking Thread.sleep in loop can cause performance problems. Klar, es funktioniert so, ich habe es jetzt auch erstmal so umgesetzt, allerdings habe ich auch nichts im Internet gefunden, was eine bessere Alternative wäre und wieso jetzt Thread.sleep() Performance-Probleme verursachen könnte
-
LeGaN schrieb:
Wenn ich aber nur einmal System.currentTimeMillis() verwende, habe ich das Problem, dass ich die "Schlafenszeit" auch mit messe. (Wobei, man könnte die ja rausrechnen mit (lastFrameTime-(30-diff)).)
Oops, ja, wiedermal nicht mitgedacht...
LeGaN schrieb:
Wenn ich nun Thrad.sleep() in einer Schleife aufrufe, sagt mir NetBeans: Invoking Thread.sleep in loop can cause performance problems.
http://stackoverflow.com/questions/3956512/java-performance-issue-with-thread-sleep
-
hustbaer schrieb:
LeGaN schrieb:
Wenn ich nun Thrad.sleep() in einer Schleife aufrufe, sagt mir NetBeans: Invoking Thread.sleep in loop can cause performance problems.
http://stackoverflow.com/questions/3956512/java-performance-issue-with-thread-sleep
Danke!