2012-07-02 12 views
20

Ich habe einen seltsamen Fehler mit Thread.sleep() auf Java. Aus irgendeinem Grund, wenn ich auf einigen Maschinen Schlaf rufe, kehrt es nie zurück. Ich kann nicht herausfinden, was dieses Verhalten verursachen könnte. Zunächst thgouth ich den Fehler könnte an anderer Stelle in meinem Code sein, so habe ich die einfachste mögliche Schlaftest:Thread.sleep() gibt nie zurück

public class SleepTest { 
    public static void main (String [] args) { 
     System.out.println ("Before sleep..."); 
     try { 
      Thread.sleep (100); 
     } catch (InterruptedException e) { 
     } 
     System.out.println ("After sleep..."); 
    } 
} 

Auf den meisten Maschinen es funktioniert, aber auf mehreren Maschinen, die ich remote in bin anmelden, es macht eine Pause auf unbestimmte Zeit zwischen den Druckanweisungen. Ich habe bis zu einer halben Stunde ohne Verhaltensänderung gewartet. Die Maschinen, die diesen Fehler anzeigen, sind Linux-Maschinen. Hier sind einige Informationen über die Maschinen:

$ uname -a 
Linux zone29ea 2.6.32-220.17.1.el6.x86_64 #1 SMP Tue May 15 17:16:46 CDT 2012 x86_64 x86_64 x86_64 GNU/Linux 
$ java -version 
java version "1.6.0_22" 
OpenJDK Runtime Environment (IcedTea6 1.10.6) (rhel-1.43.1.10.6.el6_2-x86_64) 
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode) 

Was könnte dieses Verhalten verursachen?

UPDATE

Überarbeitete Version, die noch nie endet:

public class SleepTest { 
    public static void main (String [] args) { 
     new Thread() { 
      public void run() { 
       System.out.println ("Before sleep..."); 
       try { 
        Thread.sleep (100); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       System.out.println ("After sleep..."); 
      } 
     }.start(); 
    } 
} 
+2

hast du überprüfen, ob es einen Fehler in Ihrem Fang gebrannt wird? vielleicht eine printStackTrace? –

+0

könnten Sie das in einem separaten Thread versuchen, um sicherzustellen, dass das noch auftritt? was Sie tun, ist das Haupt-Thread in den Ruhezustand setzen, die das Problem verursachen könnte –

+1

Sind Sie sicher, dass das Problem nicht in der Erholung der zweiten println ist (wie Sie es remote tun)? Vielleicht ein fehlender Flush? 'Thread.sleep (100);' funktioniert sogar unter Linux. –

Antwort

13

, wenn der Server unter Linux läuft, können Sie durch die Leap Second bug getroffen werden, die letzte Woche-Ende erscheint.

Dieser Fehler betrifft den Linux-Kernel (das Thread-Management), so dass eine Anwendung, die Threads verwendet (wie die JVM, mysql etc ...) eine hohe CPU-Belastung verursacht.

+0

Nein, die Schaltsekunde wurde in der letzten Minute der letzten Stunde des letzten Junitages hinzugefügt. Aber der NTP-Prozess Ihres Servers kann ein Problem haben. Neustart möglicherweise das Problem lösen. –

+0

Ich werde das untersuchen. Der Fehler begann nach dem 1. Juli und diese Maschinen verwenden NTP. – 101100

+0

Also der Fehler ist ein wirklich guter Kandidat. Neustart der Server sollte Ihr Problem lösen. –

3

Wenn Ihre Server verwendet NTP (wie Sie bereits erwähnt) und die CPU-Auslastung geht zu 100%, prüfen Clock: inserting leap second 23:59:60 UTC in Ihrem dmesg:, wenn Sie feststellen, dass Sie sicher sind, dass Ihr Server mit Leap Second bug betroffen, leider Java ist die, was am meisten bewirkt wird.

Um dies zu beheben, führen Sie die folgenden Befehle aus, ohne Server (wie Tomcat) neu zu starten.

/etc/init.d/ntp stop 
date `date +"%m%d%H%M%C%y.%S"` 

this helps ..

+0

Leider hatte ich keinen Root-Zugang, um diese Lösung auszuprobieren. – 101100

1

Dies scheint zweite in Bezug auf sein zu springen.

auf einem Pfosten Basierend auf von https://lkml.org/lkml/2012/7/1/19, ich habe:

date -s "`date`" 

und es das Problem behoben für mich