Thread sleep Bug

Status
Nicht offen für weitere Antworten.

thE_29

Top Contributor
Hohi!

Also wenn man ein Thread.sleep(10000) zB macht und während dem Sleep die Zeit zurückdreht, so wartet er nicht diese 10 Sekunden sondern bis die Zeit wirklich bei den 10 Sekunden vorbe ist...

Bsp.:

Code:
    long timeStamp = System.currentTimeMillis();
    System.out.println("JETZT: " + new Date().toLocaleString());
    Thread.currentThread().sleep(10000);
    System.out.println("NACHHER: " + new Date().toLocaleString());
    System.out.println("DIFF: " + (System.currentTimeMillis() - timeStamp));

Ausgabe:
JETZT: 16.07.2008 09:24:14

NACHHER: 16.07.2008 09:23:22

DIFF: -51379

Habe die Uhr einfach eine Minute zurückgedreht...

Wenn man die Uhr nach vorne stellt, spinnt das ganze noch mehr. Auf C Basis (also ein 1:1 gleiches programm in C) funktioniert aber wirklich wie es soll. Egal ob ich die Zeit verstelle!!

Weiß jemand wie man das Problem umgehen kann?! (Tritt laut meinen Entwicklern auch unter Linux auf)
 

byte

Top Contributor
wenn man ein Thread.sleep(10000) zB macht und während dem Sleep die Zeit zurückdreht, so wartet er nicht diese 10 Sekunden sondern bis die Zeit wirklich bei den 10 Sekunden vorbe ist...
Den Satz verstehe ich nicht. Wie lange schläft der Thread nun? Und wie hast Du das gemessen? System.currentTimeMillis() geht auf die Systemzeit. Wenn Du die verstellst, kannst Du damit wohl keine vernünftigen Zeitmessungen mehr machen.

Der Ausgabe zu urteilen scheint doch alles korrekt zu funktionieren. Die 2 Sek Differenz können Rundungsfehler sein und/oder durch das Verstellen der Uhr verursacht sein.
 

thE_29

Top Contributor
10 Sekunden sind 10 Sekunden, egal ob ich an der Zeit manipuliere.

Problem ist, das er nicht 10 Sekunden wartet, sondern 1 Minute und 10 Sekunden! Also solange bis die zurückgestellte Uhrzeit wieder passt.

Problem ist, wenn ich die Zeit um 1 Stunde zurücksetze. So wartet dieses Sleep nicht 10 Sekunden sondern 1 Stunde + 10 Sekunden!!


Nachtrag: OK, das C Sleep verhält sich genauso! Angeblich gehts mit usleep! Naja, gucken wir mal.
 

Kaini

Mitglied
Das geht nicht so einfach mit System.currentTimeMillis()

Wenn der Thread um 12:00:00 für 10 Minuten schlafen geht, und du stellst die Uhr eine Minute nach vor, muss 12:09:00 rauskommen. Dabei hat der Thread 10 Minuten geschlafen!
Weil wenn du die Uhr nach vor stellst kannst du dir vorstellen, dass der Thread schon um 11:59:00 zum schlafen begonnen hat. (Und bis 12:09:00 sind das nunmal 10 Minuten).

Dazu folgender Test: Ich lasse 2 Uhren mitlaufen - meine Computer Uhr und eine echte Uhr. Die Computer Uhr verstelle ich, die echte nicht.
Code:
    public static void main(String[] args) throws InterruptedException {
        long timeStamp = System.currentTimeMillis(); // PC=10:01 REAL=10:01
        System.out.println("JETZT: " + new Date().toLocaleString());
        Thread.sleep(1000 * 60 * 2); // Zeit zurück gestellt: PC=10:01 REAL=10:02
        System.out.println("NACHHER: " + new Date().toLocaleString()); // PC=10:02 REAL=10:03
        System.out.println("DIFF: " + (System.currentTimeMillis() - timeStamp));
    }
Du siehst es steht wirklich 2 Minuten still. Außer ich hab mich sehr grob verschaut :D
 

thE_29

Top Contributor
Also bei mir schläft der eindeutig länger als 10 Sekunden!
Probiers mit meinem Bsp!

Einfach 10 Sekunden schlafen lassen und die Uhr um 1 Minute zurückdrehen und du wirst sehen, das sind nie und nimmer 10 Sekunden was er da wartet!

Habe aber das gleiche Bsp jetzt unter Linux getestet und da funktioniert es..
 

The_S

Top Contributor
@Kaini

dein Geschriebenes ist wirklich mehr als verwirrend - und wies weiterhelfen soll weiß ich auch nicht ???:L .
 

Kaini

Mitglied
Naja ob es helfen tut weiß ich nicht - aber es ist ein Beweis das er nicht recht hat.

Ich habe gerade in Java sleep für zwei Minuten gemacht - meine Uhr auf 9:08 zurückgestellt und er hat nur 2 Minuten geschlaften!

Edit: Ich verwende Gentoo Linux und JRE 1.6
 

kleiner_held

Top Contributor
Grosse Teile der Implementierung von Thread werden auf native Methoden der JVM und des OS runtergebrochen.
Das Verhalten von sleep() unter solchen Randbedingungen ist also abhaengig von der JVM Version und dem Betriebssystem.
 

Kaini

Mitglied
Grosse Teile der Implementierung von Thread werden auf native Methoden der JVM und des OS runtergebrochen.
Das Verhalten von sleep() unter solchen Randbedingungen ist also abhaengig von der JVM Version und dem Betriebssystem.

Das ist aber schlecht - nicht das jetzt alle Java Programmierer beginnen ihre Programme für Windows anzupassen.

Weiß jemand wie man das Problem umgehen kann?! (Tritt laut meinen Entwicklern auch unter Linux auf)
???:L
 

thE_29

Top Contributor
Tjo, ich habe mir schnell eine DLL gebastelt und ein C Sleep gemacht. Komme aber auf das gleiche Bullshitergebnis!

Komisch ist ja das angeblich (ich teste das gleich) auf einer Wincor Nixdorf Linux Umgebung (basierend auf Fedora Core 4) und Java 1.5.0_07-b03 dieser Fehler auch auftritt!!

@Kaini: Sie habe mir das nur so gesagt! Wie gesagt unter einer SuSE 8.0 und Java 1.3 konnte ich es nicht nachstellen. Teste es gerade auf dieser Maschine wo der Fehler sein soll!!
 

tfa

Top Contributor
Bei welchem Anwendungsfall ändert sich die Systemzeit schlagartig? Eigentlich ist sowas immer böse.
 

thE_29

Top Contributor
Tjo, es geht darum das Kassen immer die Zeitabgleichen mit unseren BackOffice PCs und da kann es sein, das die Uhrzeit während dem Betrieb um 1 Stunde zurückgestellt wird (Sommerzeitumstellung). Und dann hängt das Programm EWIG (also + 1 Stunde) wegen einem 10 Sekunden sleep.
 

kleiner_held

Top Contributor
Kaini hat gesagt.:
Das ist aber schlecht - nicht das jetzt alle Java Programmierer beginnen ihre Programme für Windows anzupassen.
Hat aber den riesen Vorteil, dass die JVM Threads auf Betriebssystem Prozesse abbilden koennen und damit auch von Scheduler Optimierungen des OS profitieren koennen.

Wenn das Problem in diesem Fall wirklich ein Showstopper ist, wuerde ich mal auf http://bugs.sun.com/ recherchieren oder schauen ob sich andere Projekte (z.B.: Quartz) schon damit rumgeschlagen haben.
 

thE_29

Top Contributor
OMFG!
Die hatten wirklich recht! Unter diesen Bedingungen tritt dieser Fehler wirklich auf...
 

tfa

Top Contributor
Eigentlich sollte sich bei Sommer-/Winterzeitumstellung nichts an der Systemzeit ändern. Unter Unix sind das die vergangenen Sekunden seit 1.1.1970 UTC, Sommerzeit (Zeitzonen überhaupt) sind dann ein Problem der Anzeige. So sollte es unter Linux funktionieren. Wie das bei Windows ist, weiß ich nicht.
 
I

ipsi

Gast
also ich habs jetztmal probiert.

zur übersicht nochmal der code:
Code:
public static void main(String[] args) throws InterruptedException {
        long timeStamp = System.currentTimeMillis();
        System.out.println("JETZT: " + new Date().toLocaleString());
        Thread.sleep(1000 * 60 * 2);
        System.out.println("NACHHER: " + new Date().toLocaleString());
        System.out.println("DIFF: " + (System.currentTimeMillis() - timeStamp));
    }

das ergebniss:

compile:
run:
JETZT: 16.07.2008 10:28:21
NACHHER: 16.07.2008 09:30:18
DIFF: -3483225
ERSTELLEN ERFOLGREICH (Gesamtzeit: 0 Minuten 0 Sekunden)
 

thE_29

Top Contributor
Komisch unter XP verwende ich java 1.6.0_04-b12 mit Win XP SP2 und da gings nicht!
Ich teste gerade mal die neueste JRE 6 Version unter Linux da es mit der letzten JRE5 auch nicht ging!
 
G

Guest

Gast
so bin jetzt mal regestriert :D

echt bisi komisch...
ich mein ich bin jetzt sicher kein programmier ass, aber...
tja bin grad bisi ratlos... :bahnhof:
 

thE_29

Top Contributor
Komisch ist, das es selbst mit der JDK 1.6.0_10 bei mir unter XP nicht funktioniert!

Hingegen mit der letzten JRE6 unter Linux gehts auch auf diesem Wincor Nixdorf System! Problem ist nur, das wir Wincor Nixdorf jetzt überzeugen müssen, eine neue JRE mitauszulieferen und Epson muss schauen ob deren SW auch mit der 1.6 Tip Top läuft.
 

ipsi

Mitglied
Anonymous hat gesagt.:
so bin jetzt mal regestriert :D

echt bisi komisch...
ich mein ich bin jetzt sicher kein programmier ass, aber...
tja bin grad bisi ratlos... :bahnhof:

so war komischerweiße ned eingeloggt, war von mir.

hmm... vllt spuckt google was aus :###
 

thE_29

Top Contributor
Naja, da man das anscheinend nicht wirklich umgehen kann (zumindest bei bestimmen Java Versionen) gibts da wohl keine Abhilfe. Man muss halt damit leben..
 

didjitalist

Bekanntes Mitglied
Sind die Scheduler davon auch betroffen? Thread#sleep ist wirklich sehr systemnah, evtl. sind die Scheduler anders implementiert.
 

thE_29

Top Contributor
Naja, ich weiß, dass das beim Windows Shutdown program (shutdown.exe) genauso auftritt.
Also wenn man zB einestellt fahre den PC in 30 Sekunden runter und man verstellt die Uhrzeit, dann hat man das gleiche Verhalten.
 

Kaini

Mitglied
Wow - wirklich? Naja da wird sich so mancher Admin freuen.

Gibt es dagegen einen Warkaround oder muss man sich da was anderes überlegen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Thread.sleep Problem Allgemeine Java-Themen 2
B Thread.sleep() in EJB Container wie lösen? Allgemeine Java-Themen 11
mrbig2017 Sleep wird ignoriert und der Thread wartet nicht Allgemeine Java-Themen 1
W Thread sleep 30 sekunden - wenn keine Antwort bis dahin neu senden Allgemeine Java-Themen 2
V Thread.sleep und InterruptedException? Allgemeine Java-Themen 1
H Netbeans Warning bei Thread.sleep in Schleife Allgemeine Java-Themen 4
G Thread.sleep Allgemeine Java-Themen 12
K Threads Thread für Sleep Allgemeine Java-Themen 6
C Thread.sleep pausiert das ganze Programm Allgemeine Java-Themen 4
hdi volatile & Thread#sleep/yield - Versteh ich nich Allgemeine Java-Themen 14
P Thread.sleep() ungenau??? Allgemeine Java-Themen 10
V Enerjy und Use of Thread.sleep() Allgemeine Java-Themen 2
Schandro Thread.sleep(0) Allgemeine Java-Themen 6
J Was ist genauer: Thread.sleep() oder meine Variante? Allgemeine Java-Themen 64
padde479 The static method sleep(long) from the type Thread should. Allgemeine Java-Themen 2
R Thread.sleep - abfragen Allgemeine Java-Themen 4
T Ersatz für Thread.sleep Allgemeine Java-Themen 8
T Frage zu Thread.sleep() Allgemeine Java-Themen 2
G Thread.currentThread().sleep() und Thread.sleep() Allgemeine Java-Themen 2
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
smarterToby Wie stoppe ich diesen Thread Allgemeine Java-Themen 4
J Thread started nur einmal Allgemeine Java-Themen 19
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
OnDemand Logfile pro User / Thread Allgemeine Java-Themen 7
OnDemand Thread / Service abbrechen Allgemeine Java-Themen 3
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
S Ist das Neuzuweisen von Feldern atomic und damit Thread-Safe? Allgemeine Java-Themen 2
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
Flynn Thread-Problem... Allgemeine Java-Themen 2
G Thread-Programmierung Allgemeine Java-Themen 5
S Datei wird nicht gefunden Thread.currentThread().getContextClassLoader().getResourceAsStream() Allgemeine Java-Themen 1
G Beendet sich der Thread selbst?! Allgemeine Java-Themen 3
S Thread beenden Allgemeine Java-Themen 9
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
Aruetiise Swing JOptionPane ohne denn Thread zu pausieren Allgemeine Java-Themen 1
M Nanosekunden-Pause innerhalb einen Thread-Loops Allgemeine Java-Themen 3
E Thread Exception Allgemeine Java-Themen 6
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
T Merkwürdiges Thread-Verhalten Allgemeine Java-Themen 6
K Thread Problem Allgemeine Java-Themen 6
H Thread bleibt stehen bei jar in jar Allgemeine Java-Themen 1
J Threads HTTP Request (Thread) dauert lange - in Android Allgemeine Java-Themen 3
F CPU Last eines Thread ausfindig machen Allgemeine Java-Themen 0
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
Tausendsassa Threads Einen Thread sich selbst schließen lassen Allgemeine Java-Themen 17
P Threads BufferedImage, Thread Concurrency Allgemeine Java-Themen 1
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
llabusch Thread blockiert Dialog Allgemeine Java-Themen 1
J Thread wait() Allgemeine Java-Themen 2
G Thread nicht von GC zerstört Allgemeine Java-Themen 6
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
Sogomn Thread blocken bis Taste gedrückt Allgemeine Java-Themen 5
T Starten vom Thread Allgemeine Java-Themen 3
T Wait/Notify() bei Thread Allgemeine Java-Themen 6
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
M Exception in thread "AWT-EventQueue-0" Allgemeine Java-Themen 6
Q Thread wacht nicht auf Allgemeine Java-Themen 7
T Fragen zum Thread-Thema Allgemeine Java-Themen 4
T Threads Input/Output im Thread - Datei ohne Inhalt Allgemeine Java-Themen 1
T Fragen zum Thread-Thema Allgemeine Java-Themen 9
C Threads Variablen in einem Thread Aktualisieren Allgemeine Java-Themen 17
U Thread beenden Allgemeine Java-Themen 3
W Threads Mit Thread und Runtime externe Programme öffnen Allgemeine Java-Themen 0
N Thread interrupt Status debuggen Allgemeine Java-Themen 6
A Thread: Code paralell ausführen in mehreren Instanzen Allgemeine Java-Themen 1
E Threads linkedlist/multi-thread problem Allgemeine Java-Themen 3
B Erkennen, wann Prozess beendet ist, dann Thread beenden. Allgemeine Java-Themen 6
A Thread Fehler absichtlich provozieren Allgemeine Java-Themen 3
B Threads Java Thread kommunizieren Allgemeine Java-Themen 12
N Thread Sicherheit im komplexen Datenmodell Allgemeine Java-Themen 7
K Thread richtig benutzen Allgemeine Java-Themen 3
K Exception in thread "AWT-EventQueue-1" Allgemeine Java-Themen 2
vandread Problem bei kleiner Thread-Übung Allgemeine Java-Themen 2
G Thread erzeugt nicht plausible NullPointerException Allgemeine Java-Themen 7
P [Thread] Scheint nicht Sequenziell zu Arbeiten Allgemeine Java-Themen 9
A eine test thread.join() frage Allgemeine Java-Themen 2
tuttle64 Verständnisprobleme mit Thread Locks Allgemeine Java-Themen 4
G Threads Thread bei Datenabfrage Allgemeine Java-Themen 3
S Thread anhalten per Button ? Allgemeine Java-Themen 3
E Thread Programmierung Allgemeine Java-Themen 2
S Threads ServerSocket-Thread soll schlafen, bis er gebraucht wird Allgemeine Java-Themen 2
V Thread schneller stoppen Allgemeine Java-Themen 2
V anstatt thread.join() einfach while schleife? Allgemeine Java-Themen 8
B Mausbewegung im Thread erkennen (hoch/runter) Allgemeine Java-Themen 6
G Linux/C++/Pthreads auf JVM zugreifen, thread safe? Allgemeine Java-Themen 10
K Threads Probleme mit Thread Allgemeine Java-Themen 13
K Threads Thread überprüfen Allgemeine Java-Themen 3
Z Threads Thread für einen Client Allgemeine Java-Themen 9
M Thread JavaFish Allgemeine Java-Themen 10
M Threads Viele Aufrufe aus Thread, komisches Verhalten Allgemeine Java-Themen 8
B Threads Main Thread warten auf abgebrochen Task warten lassen Allgemeine Java-Themen 25
K Timer Thread Allgemeine Java-Themen 8
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
N java.lang.IllegalMonitorStateException: object not locked by thread before notify() Allgemeine Java-Themen 2
C Mehothode in anderenm Thread aufrufen Allgemeine Java-Themen 10
R Thread läuft nicht?! Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben