Java Thread.sleep()无法正常工作,为什么?

时间:2012-02-28 21:17:49

标签: java

在我的代码下面给我奇怪的结果,显然你必须得到1000,但实际上不要指望低于3500的任何东西。我在不同的运行中得到3500-4500。我读了一些Thread.sleep完全不可靠的地方。为什么java不能分离,如果它没用?

那有什么解决方案吗?

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

            }

4 个答案:

答案 0 :(得分:4)

它完全符合它所说的,的睡眠时间至少 5毫秒。没有什么能保证它不会等待更久,它从未声称。 (诚​​然,该方法的javadoc可以给人一种线程会立即恢复的印象,实际上这取决于操作系统/ jvm,你无法控制它。)

运行需要3-4秒,这当然很奇怪。取决于您的平台/操作系统以及您的计算机当时可能做的其他事情。我得到1010和1020之间的结果运行该确切的代码片段。那是你实际运行的,还是你从一个更大的程序中提取它?

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

这并不是没用,只是你必须小心使用它,而不是期望一致的结果,因为再次线程很少得到保证。

答案 3 :(得分:0)

如果你需要某种类型的Timer,那么低级别的Thread就不是正确的。线程利用底层OS Scheduler将CPU时间分配给系统进程。实际上,JavaVM也会生成进程,并且JavaVM调度程序会为线程提供CPU时间。

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

如果您需要准确的时序,请查看TimerTask和Timer