2012-07-02 7 views
20

JavaでThread.sleep()と奇妙なエラーがあります。何らかの理由で、私がいくつかのマシンでスリープを呼び出すと、それは決して返されません。私はこの現象の原因となるものが何であるか把握できません。 、それは無期限に一時停止し、それは私がリモートにログインしていますいくつかのマシン上で動作しますが、ほとんどのマシンでThread.sleep()返さない

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

:最初は、私はエラーが私のコード内の別の場所かもしれませんthgouthので、私は可能な限り単純な睡眠のテストを行いましたprintステートメントの間。私は行動を変えずに30分ほど待った。このエラーを表示しているマシンはLinuxマシンです。機械に関するいくつかの情報は次のとおりです。

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

この現象の原因は何ですか?それでも決して終わらない

UPDATE

改訂版、:

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

私のために問題を修正し、あなたのキャッチの内側に解雇エラーがある場合はチェックしましたか?多分printStackTrace? –

+0

あなたはそれがまだ発生していることを確認するために別のスレッドで試してみることができますか?あなたがやっていることは、メインスレッドをスリープ状態にして問題を引き起こす可能性があります。 –

+1

問題は2番目のprintlnの復旧にはないと思いますか?たぶん欠けていますか? 'Thread.sleep(100);'はLinuxでも動作します。 –

答えて

13

をお使いのサーバがLinuxで実行されている場合、あなたは先週エンドを表示さLeap Second bugでヒットすることができます。

このバグはLinuxカーネル(スレッド管理)に影響するため、スレッドを使用するアプリケーション(JVM、mysqlなど)はCPU負荷が高くなる可能性があります。

+0

いいえ、うるう秒は6月の最終日の最後の1時の最後の分に追加されました。しかし、あなたのサーバーのNTPプロセスに問題があるかもしれません。再起動すると問題が解決する場合があります。 –

+0

これを調べます。エラーは7月1日以降に発生し、これらのマシンはNTPを使用します。 – 101100

+0

バグは本当に良い候補です。サーバーをリブートすると問題が解決するはずです。 –

3

(あなたが述べたように)あなたのサーバーは、NTPを使用して、CPUの使用率が100%になり、あなたのdmesg:Clock: inserting leap second 23:59:60 UTCをチェックし、あなたがあなたのサーバがLeap Second bugに罹患していることを確認している、ことを発見した場合は、残念ながらJavaは1である場合最も効果的です。

これを解決するには、Tomcatのようなサーバーを再起動しないで、次のコマンドを実行します。

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

・ホープ、このことができます。..

+0

残念ながら、私はこのソリューションを試すためのルートアクセス権を持っていませんでした。 – 101100

1

これにより、第2関連の飛躍であるように見えるん。 https://lkml.org/lkml/2012/7/1/19からのポストに基づいて

は、私がやった:

date -s "`date`" 

をし、それが

関連する問題