Ich poste das mal hier, weil ich denke, daß man kleine Werte für Thread.sleep() am ehesten bei Spielen benutzt...
Bekanntlich gibt es unter WinXP (u.ä.) einen Bug bei der Implementierung von Thread.sleep(), der dazu führt, daß man bei sehr kleinen Parameterwerten nicht nur unplausible Ergebnisse bekommt, sondern im schlimmsten Fall sogar die Systemzeit verstellen kann (weil die Systemuhr während er Programmausführung deutlich schneller läuft).
Das wurde vor langer Zeit mal diskutiert und ich habe damals als Workaround Sleep-Zeiten von unter 20ms verhindert, was auch ganz gut geklappt hat, aber auf schwachen Systemen halt eine CPU-Last von 100% verursachen kann.
Wie es der Zufall so will, bin ich heute zufällig über einen Workaround im Java Bugtracker gestolpert und wollte Euch nicht dumm sterben lassen, falls er hier noch nicht bekannt ist:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6435126
Im Kern startet man einen Daemon-Thread, in dem man ein "Thread.sleep(Integer.MAX_VALUE)" aufruft.
Das führt anscheinend dazu, daß systemweit (!) auf eine Timerauflösung von 1ms (statt 10ms) umgestellt wird und man somit auch Sleep-Werte unter 10ms benutzen kann.
Weil die systemweite Timerauflösung sich nach der höchsten Anforderung der laufenden Prozesse richtet, kann es durchaus auch sein, daß bereits eine andere Anwendung die hohe Auflösung angefordert hat. Das erklärt vermutlich auch, warum die Sleep-Probleme nicht auf jedem Rechner aufgetreten sind (das mit dem Verstellen der Systemzeit hat aber vermutlich noch einen komplexeren Hintergrund).
Nebenbei: dem Bugtracker-Eintrag kann man auch entnehmen, daß es schon lange einen Schalter "ForceTimeHighResolution" für diesen Zweck gibt, der allerdings von Anfang an falsch implementiert war und man es für zu riskant hielt, die Funktionsweise des Schalters zu korrigieren, weil ja bislang alle damit zufrieden waren
Leider kann ich den Workaround nicht wirklich testen, weil mein Rechner laut Perfmon bereits mit hoher Timerauflösung läuft. Falls jemand noch einen Rechner hat, auf dem das nicht der Fall ist (wie man es testet, ist ebenfalls im Bugtracker beschrieben), würde ich mich über eine Rückmeldung freuen, ob dieser Workaround tatsächlich funktioniert. Inbesondere würde ich natürlich auch gerne wissen, ob dieser Workaround das Verstellen der Systemzeit auf den dafür anfälligen Rechnern verhindert. Mein eigener (Firmen)-Testrechner ist leider nicht mehr existent.
Bekanntlich gibt es unter WinXP (u.ä.) einen Bug bei der Implementierung von Thread.sleep(), der dazu führt, daß man bei sehr kleinen Parameterwerten nicht nur unplausible Ergebnisse bekommt, sondern im schlimmsten Fall sogar die Systemzeit verstellen kann (weil die Systemuhr während er Programmausführung deutlich schneller läuft).
Das wurde vor langer Zeit mal diskutiert und ich habe damals als Workaround Sleep-Zeiten von unter 20ms verhindert, was auch ganz gut geklappt hat, aber auf schwachen Systemen halt eine CPU-Last von 100% verursachen kann.
Wie es der Zufall so will, bin ich heute zufällig über einen Workaround im Java Bugtracker gestolpert und wollte Euch nicht dumm sterben lassen, falls er hier noch nicht bekannt ist:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6435126
Im Kern startet man einen Daemon-Thread, in dem man ein "Thread.sleep(Integer.MAX_VALUE)" aufruft.
Das führt anscheinend dazu, daß systemweit (!) auf eine Timerauflösung von 1ms (statt 10ms) umgestellt wird und man somit auch Sleep-Werte unter 10ms benutzen kann.
Weil die systemweite Timerauflösung sich nach der höchsten Anforderung der laufenden Prozesse richtet, kann es durchaus auch sein, daß bereits eine andere Anwendung die hohe Auflösung angefordert hat. Das erklärt vermutlich auch, warum die Sleep-Probleme nicht auf jedem Rechner aufgetreten sind (das mit dem Verstellen der Systemzeit hat aber vermutlich noch einen komplexeren Hintergrund).
Nebenbei: dem Bugtracker-Eintrag kann man auch entnehmen, daß es schon lange einen Schalter "ForceTimeHighResolution" für diesen Zweck gibt, der allerdings von Anfang an falsch implementiert war und man es für zu riskant hielt, die Funktionsweise des Schalters zu korrigieren, weil ja bislang alle damit zufrieden waren
Leider kann ich den Workaround nicht wirklich testen, weil mein Rechner laut Perfmon bereits mit hoher Timerauflösung läuft. Falls jemand noch einen Rechner hat, auf dem das nicht der Fall ist (wie man es testet, ist ebenfalls im Bugtracker beschrieben), würde ich mich über eine Rückmeldung freuen, ob dieser Workaround tatsächlich funktioniert. Inbesondere würde ich natürlich auch gerne wissen, ob dieser Workaround das Verstellen der Systemzeit auf den dafür anfälligen Rechnern verhindert. Mein eigener (Firmen)-Testrechner ist leider nicht mehr existent.