2012-07-02 26 views
20

Mam nieparzysty błąd z Thread.sleep() na Java. Z jakiegoś powodu, kiedy wywołuję uśpienie na niektórych maszynach, nigdy nie wraca. Nie mogę zrozumieć, co może być przyczyną tego zachowania. Początkowo ja thgouth błędu może być gdzie indziej w moim kodu, więc zrobiłem najprostszą możliwą próbę uśpienia:Thread.sleep() Nigdy nie zwraca

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..."); 
    } 
} 

Na większości maszyn to działa, ale na kilku maszynach, które mam zdalnie zalogowaniu się, że wstrzymuje na czas nieokreślony między instrukcjami drukowania. Czekałem nawet pół godziny bez zmiany zachowania. Maszyny, które wyświetlają ten błąd, to komputery z systemem Linux. Oto kilka informacji o maszynach:

$ 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) 

Co może być przyczyną tego zachowania?

UPDATE

wersja poprawiona, co jeszcze nigdy się nie kończy:

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

pan sprawdzić, czy nie ma błędu zwolniony wewnątrz połowu? może printStackTrace? –

+0

możesz spróbować tego w osobnym wątku, aby upewnić się, że to nadal występuje? co robisz, to umieszczenie głównego wątku w trybie uśpienia, co może spowodować problem? –

+1

Czy jesteś pewien, że problem nie dotyczy regeneracji drugiego println (tak jak robisz to zdalnie)? Może brakujący kolor? 'Thread.sleep (100);' działa nawet na Linuksie. –

Odpowiedz

13

jeśli serwer pracuje pod Linuksem, może być trafiony przez Leap Second bug który pojawia się ostatni weekend.

Ten błąd dotyczy jądra systemu Linux (zarządzanie wątkami), więc aplikacja wykorzystująca wątki (takie jak JVM, mysql itp.) Może zużywać duże obciążenie procesora.

+0

Nie, sekunda przestępna została dodana w ostatniej minucie ostatniej godziny ostatniego dnia czerwca. Ale proces NTP twojego serwera może mieć problem. Ponowne uruchomienie może rozwiązać problem. –

+0

Zajrzę do tego. Błąd rozpoczął się po 1 lipca, a te maszyny korzystają z NTP. – 101100

+0

Więc błąd jest naprawdę dobrym kandydatem. Ponowne uruchomienie serwerów powinno rozwiązać twój problem. –

3

Jeśli serwery używa protokołu NTP (jak wspomniano) i użycie procesora udaje się do 100%, sprawdzić Clock: inserting leap second 23:59:60 UTC w swojej dmesg:, jeśli okaże się, że jesteś pewien, że twój serwer dotknięte Leap Second bug niestety Java jest jednym co jest najbardziej skuteczne.

Aby rozwiązać ten problem, bez restartowania jakichkolwiek serwerów (takich jak tomcat) uruchom następujące polecenia.

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

Nadzieja to pomaga ..

+0

Niestety, nie miałem uprawnień roota do wypróbowania tego rozwiązania. – 101100

Powiązane problemy