[英]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.