20

Thread.sleep()在 Java 上遇到了一个奇怪的错误。出于某种原因,当我在某些机器上调用 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...");
    }
}

在大多数机器上它都可以工作,但在我远程登录的几台机器上,它在打印语句之间无限期地暂停。我已经等了半个小时,行为没有改变。显示此错误的机器是 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 下运行,您可能会受到上周末出现的Leap Second 错误的影响。

该漏洞影响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 回答