Thread.sleep()永远不会返回

我在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) 

什么可能导致这种行为?

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

如果您的服务器在Linux下运行,您可能会遇到上周末出现的Leap Second错误 。

这个bug会影响Linux内核(线程管理),因此使用线程的应用程序(如JVM,mysql等……)可能会占用大量CPU。

如果您的服务器使用NTP(如您所述)并且您的CPU使用率达到100%,请检查Clock: inserting leap second 23:59:60 UTC在您的dmesg: 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"` 

希望这可以帮助..

这似乎与闰秒相关。

根据https://lkml.org/lkml/2012/7/1/19上的post,我做了:

 date -s "`date`" 

它解决了我的问题