Thread.sleep(20) dauert 31ms ?

Status
Nicht offen für weitere Antworten.
M

Mr. X

Gast
Hallo,

mein Programm war irgendwie sehr langsam, also hab ich mal einen Zeitmesser eingebaut.
Um zu erfahren welche meiner Methoden so lange braucht, hab ich eine nach der anderen rausgenommen,
bis ich bei 0 Methoden war, und das hat mich dann doch sehr verwundert:

Code:
long startTime = System.currentTimeMillis();

/*

..

*/

try{Thread.sleep(20);} 
catch(InterruptedException e){}

long usedTime = System.currentTimeMillis() - startTime;
				
System.out.println("Es wurden " + usedTime + "ms benötigt.");

Das Ergebnis:

Es wurden immer so zwischen 31 und 32 ms gebraucht.
Nur für was wurden die 11 - 12 ms Differenz gebraucht?

Danke

Mfg

Mr. X
 

byte

Top Contributor
Wenn Du einen Thread schlafen legst, dann gibt er die Kontrolle an andere Threads ab. Du kannst aber nicht davon ausgehen, dass der Thread nach der angegebenen Zeit die Kontrolle sofort wiederbekommt. Das hängt vom derzeitig aktiven Thread ab und von etwaigen anderen wartenden Threads. Die einzige Zusicherung ist die, dass der Thread vor Ablauf dieses Zeitraums weitermacht. Du könntest versuchen, in den anderen Threads z.B. durch ein häufiges Thread.yield() das Ergebnis zu beeinflussen, aber selbst das ist nur ein Hint für den Scheduler. Java sowie die gängigen Betriebssystems sind halt keine Echtzeitsysteme, und selbst bei Echtzeitsystemen wird afaik wird Zeit durch Intervalle gehandlet (Ober-, Untergrenzen).
 
M

Mr. X

Gast
Hab eigentlich nur diesen Thread. Wie schaffe ich es jetzt, etwas genau alle 20ms zu tun?
Die Differenz von 20 und 31 ms ist immerhin sehr groß..

Wie sieht das jetzt auf anderen Systemen aus? Werden meine Animationen dort noch langsamer?
Hab ich keinerlei Kontrolle über die Ablaufgeschwindigkeit meines Programmes?

Hab schon überlegt ob ich am Ende jedes Durchlaufs die Zeitdifferenz errechne (31-20)
und für diese "fehlende" Zeit die Rechnungen nachhole.

Also zB 10 Rechnungen pro Durchlauf mit 20ms.
Dauert das ganze dann 31ms so werden für die fehlenden 11 ms also ca. 5 Rechnungen nachgeholt.

Das Problem dabei, es wird etwas ungenau (11ms läßt sich nicht Restfrei durch 2 teilen)
und ausserdem Fängt die Animation an zu Ruckeln.

Mfg

Mr. X
 

byte

Top Contributor
Also das Sleep bewirkt bei Dir dann einfach nur, dass konstant 20 ms lang gar nichts passiert. Die Differenz (11 ms) vergeht dann wohl vor dem Sleep. Dein Problem ist so nicht lösbar. Selbst wenn die Berechnung bei Dir immer genau 11 ms dauert, dann kann das auf einem anderen Rechner schon wieder ganz anders sein.
 

Bert Brenner

Bekanntes Mitglied
Schon mal drüber nachgedacht das vielleicht nicht nur das Thread.sleep für die Abweichungen verantwortlich ist, sondern die ungenigkeit durch System.currentTimeMillis?

Siehe auch API, vielleicht solltest du mit nanoTime arbeiten.

Hier noch ein API auszug bzgl. currentTimeMillis()
Returns the current time in milliseconds. Note that while the unit of time of the return value is a millisecond, the granularity of the value depends on the underlying operating system and may be larger. For example, many operating systems measure time in units of tens of milliseconds.

Hier noch ein kleines Beispiel um das Problem zu verdeutlichen:
Code:
  public static void main(String[] args) {
    long oldTime=System.currentTimeMillis();
    while (true){
      long newTime = System.currentTimeMillis();
      System.out.println("Diff: " + (newTime - oldTime));
      oldTime = newTime;
    }
  }
 

Murray

Top Contributor
Bert Brenner hat gesagt.:
Siehe auch API, vielleicht solltest du mit nanoTime arbeiten.
nanoTime hat zwar eine höhere Auflösung, aber nicht notwendigerweise auch die Genauigkeit, die diese Auflösung vortäuscht ;-)

Grundsätzlich erfordert der Ansatz, zwischen zwei Operationen eine exakt definierte Zeit verstreichen zu lassen, ein Echtzeitbetriebssystem, was z.B. auf Windows nicht zutrifft. Insofern kann es da nicht funktionieren.

Wenn es sich nicht um allzu kleine Zeitintervalle handelt (also eher im Sekunden als im Millisekundenbereich), dann kann man solche Aufgaben mit java.util.Timer und java.util.TimerTask angehen, aber auch da gibt es keine Garantie.
 

Ark

Top Contributor
Was Du noch machen könntest, ist das Erhöhen der Priorität deines Threads, so ist zumindest die Wahrscheinlichkeit, dass er drankommt, gestiegen. Man könnte prinzipiell auch mehrere zu dieser Aufgabe synchronisierte Threads starten (sagen wir 100 Stück :lol: ), dann gehören — je nach System — Dir eventuell 1/6 aller auf dem OS laufenden Threads. Aber davon würde ich dringend abraten.

Ein ganz anderer Weg wäre — neben einer hohen Priorität — eine dafür geeignetere Sprache (sprich: Assembler) zu wählen.

MfG
Ark
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Thread.sleep() Java Basics - Anfänger-Themen 5
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
P Threads Thread.sleep() Java Basics - Anfänger-Themen 7
M Fehler bei Thread.sleep() Java Basics - Anfänger-Themen 5
B Thread.sleep() Java Basics - Anfänger-Themen 1
C Thread.sleep ratsam? Java Basics - Anfänger-Themen 6
L Thread.sleep Java Basics - Anfänger-Themen 6
G problem mit thread.sleep() Java Basics - Anfänger-Themen 6
M Threads Thread.Sleep Problem im Zusammenhang mit GUI/ActionPerformed-Methode Java Basics - Anfänger-Themen 4
T Thread Sleep() Java Basics - Anfänger-Themen 4
J Thread.sleep Java Basics - Anfänger-Themen 7
A Thread.sleep() unterbrechen? Java Basics - Anfänger-Themen 3
S Thread.sleep () - Frage Java Basics - Anfänger-Themen 16
M Frage zur Methode Thread.sleep() Java Basics - Anfänger-Themen 6
O Memory Thread.sleep() Java Basics - Anfänger-Themen 5
G Problem mit Thread Sleep! Java Basics - Anfänger-Themen 3
S Thread.sleep i.V.m Button.setText() Java Basics - Anfänger-Themen 8
G Schleife mit Thread.sleep pausieren Java Basics - Anfänger-Themen 12
R Thread - sleep - interrupt Java Basics - Anfänger-Themen 18
E Anfänger Problem mit Thread.sleep() Java Basics - Anfänger-Themen 11
S Thread.sleep Java Basics - Anfänger-Themen 6
V Alternative zu Thread.sleep() ? Java Basics - Anfänger-Themen 6
S Runtime.exec -> Thread.sleep -> Konflikt Java Basics - Anfänger-Themen 7
A Thread.sleep Java Basics - Anfänger-Themen 9
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
C Thread und TimerTask, Verstädnisproblem Java Basics - Anfänger-Themen 10
amgadalghabra Sorting Thread Launcher Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
A Thread Java Basics - Anfänger-Themen 4
A Thread Java Basics - Anfänger-Themen 1
A Thread Java Basics - Anfänger-Themen 0
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
B Thread / Prozess stoppen? Java Basics - Anfänger-Themen 22
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 0
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
J Thread Handling Java Basics - Anfänger-Themen 9
C Thread in Methode + raus aus der Schleife Java Basics - Anfänger-Themen 10
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
B Thread Problem Java Basics - Anfänger-Themen 7
N KeyListener in Thread Java Basics - Anfänger-Themen 0
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
D Ausgeben welcher Thread gerade Arbeitet Java Basics - Anfänger-Themen 8
N Threads Thread-Fehler Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
J Exception in thread "main" Java Basics - Anfänger-Themen 1
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4
J BouncingBalls 1 Thread Java Basics - Anfänger-Themen 3
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
fLooojava Laufender Thread | Boolean ändern Java Basics - Anfänger-Themen 9
T Thread Pool mit Work Stealing Java Basics - Anfänger-Themen 1
R Java Thread Java Basics - Anfänger-Themen 10
J Welche Methoden laufen im neuen thread ?? Java Basics - Anfänger-Themen 9
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben