繁体   English   中英

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

[英]Java Thread.sleep() Cant Works Properly ,Why?

在我的代码下面给了我奇怪的结果,显然您必须得到1000 ,但实际上不要期望低于3500。在不同的运行中我得到3500-4500。 我读了一些Thread.sleep完全不可靠的地方。 如果Java没有 ,为什么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);

            }

它完全按照它所说的进行,即睡眠至少 5毫秒。 没有任何东西可以保证它不会等待更长的时间,它永远不会声称要这样做。 (诚​​然,该方法上的javadoc可以给人以线程将立即恢复的印象,实际上这取决于操作系统/ jvm,您无法对其进行控制。)

大概需要3-4秒才能运行,这确实很奇怪。 取决于您的平台/操作系统以及您的计算机当时可能在做什么。 在运行该确切代码段的1010到1020之间,我得到了结果。 那是您实际正在运行的内容,还是您从较大的程序中提取了该内容作为示例?

默认情况下,较早版本的Windows至少有15毫秒的睡眠时间,这将解释3秒钟内的值。 有些JVM与Windows进行修补以获得更好的睡眠分辨率,但是对于JVM版本和OS版本的任何特定组合,很难说!

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

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

并不是说它没有用,只是您必须谨慎使用它,并且不要期望获得一致的结果,因为再次保证线程很少。

如果您需要某种计时器,那么低级线程是不正确的。 线程利用底层的OS Scheduler将CPU时间分配给系统进程。 实际上,JavaVM还会生成进程,并且JavaVM Scheduler会向线程提供CPU时间。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM