20

Javaで奇妙なエラーが発生し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...");
    }
}

ほとんどのマシンで動作しますが、リモートでログインしているいくつかのマシンでは、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)

この動作の原因は何でしょうか?

アップデート

まだ終わらない改訂版:

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();
    }
}
4

3 に答える 3

13

サーバーがLinuxで実行されている場合、先週末に発生するうるう秒のバグに見舞われる可能性があります。

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

于 2012-07-02T13:25:58.390 に答える
3

サーバーがNTPを使用していて(前述のとおり)、CPU使用率が100%になっている場合は、サーバーをチェックしClock: inserting leap second 23:59:60 UTCてくださいdmesg:。その場合は、サーバーが影響を受けていることを確認してくださいLeap Second bug。残念ながら、Javaが最も影響を受けています。

これを解決するには、サーバー(tomcatなど)を再起動せずに、次のコマンドを実行します。

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

お役に立てれば..

于 2012-07-03T07:25:26.273 に答える
1

これはうるう秒に関連しているようです。

https://lkml.org/lkml/2012/7/1/19からの投稿に基づいて、私は次のことを行いました。

date -s "`date`"

そしてそれは私のために問題を修正しました

于 2012-07-04T17:49:29.507 に答える