我在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...");
}
}
在大多数计算机上都能正常工作,但在我远程登录的几台计算机上,它会在打印语句之间无限期地暂停。我等了半个小时,行为没有变化。显示此错误的计算机是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();
}
}
答案 0 :(得分:13)
如果您的服务器在Linux下运行,您可能会遇到上周末出现的Leap Second bug。
此错误会影响Linux内核(线程管理),因此使用线程的应用程序(如JVM,mysql等)可能会占用大量CPU。
答案 1 :(得分: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"`
希望这会有所帮助..
答案 2 :(得分:1)