在我的代码下面给我奇怪的结果,显然你必须得到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);
}
答案 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