2012-02-28 27 views
0

下面我的代码给我奇怪的结果,显然你必须得到1000,但实际上不要期望3500以下的任何东西。我得到了不同的运行3500-4500。我读了一些Thread.sleep完全不可靠的地方。为什么java不是Depcrecate它,如果它没用?Java Thread.sleep()无法正常工作,为什么?

是否有任何解决方案对此?

class MyClass { 

      public static void main (String[] args) { 

        long start, end, took; 

        start = System.currentTimeMillis(); 
        for (int i=0; i<200; i++) { 
          try { 
          Thread.sleep (5); 
          } catch (Exception ex) { 
            ex.printStackTrace(); 
          } 
        } 
        end = System.currentTimeMillis(); 
        System.out.println("Start :: " + start); 
        System.out.println("end :: " + end); 
        took = end -start; 
        System.out.println ("Took: " + took); 

      } 
+0

您使用的是哪个平台和JDK/JRE?预计会有超过1000个(高达2000-3000的范围似乎非常合理)。 (顺便说一句,我越来越1010-1020一贯这里) – Mat 2012-02-28 21:22:40

+0

开始:: 1330464140994 结束:: 1330464142016 注意到:1022 这里是我的结果,没有什么似乎很奇怪 – 2012-02-28 21:23:32

+0

请使用[System.nanoTime(HTTP:/ /docs.oracle.com/javase/6/docs/api/java/lang/System.html#nanoTime())来测量代码执行。 – paislee 2012-02-28 21:24:06

回答

1

Thread.sleep中的精确计时不能保证,这正是您在不同运行中获得不同计时的原因。

更好使用RealTimeThread在Java中进行实时计算。

+0

为什么java不会在我们有realTimeThread时被弃用? – 2012-02-28 21:30:09

+0

要使用实时线程,您需要实时操作系统上的Real Time Java。请参阅:http://java.sun.com/javase/technologies/realtime/index。jsp大多数应用程序不需要精确的计时计算,因此对Thread.sleep计算非常满意。 – anubhava 2012-02-28 21:32:45

+0

因为java实时只能在solaris和linux的特定版本上运行:) – Affe 2012-02-28 21:42:15

0

这并不是说这是无用的,它只是你必须谨慎使用,而不是预期一致的结果,因为再次与线程很少有保证。

4

它的确如它所说的那样睡眠至少 5毫秒。没有什么能保证它不会再等待,它从来没有声称过。 (无可否认,该方法上的javadoc可以给出线程将立即恢复的印象,实际上这取决于操作系统/ jvm,并且您无法控制它。)

这真的很奇怪,运行4秒。取决于您的平台/操作系统以及您的计算机当时可能在做什么。我得到1010和1020之间运行精确代码片段的结果。这是你实际运行的还是你从一个更大的程序中提取的例子?

较旧版本的Windows默认情况下至少有15ms的睡眠时间,这可以解释超过3秒的值。一些JVM使用Windows修补以获得更好的睡眠解决方案,但对于JVM版本和操作系统版本的任何特定组合,很难说!

0

如果您需要某种定时器低级别线程不是正确的事情。一个线程使用下层的OS Scheduler来将CPU时间分配给系统的进程。事实上,JavaVM也会产生进程,并且一个线程由JavaVM调度程序提供CPU时间。

当您将线程切换到睡眠状态时,您必须等到计划程序再次唤醒您。

如果您需要准确的定时,请查看TimerTask和定时器