我想要一个特定时间的忙等待循环,我测试了以下java代码,它在不同的运行(有时)上提供不同的输出。大部分时间它给出16和0.这意味着一个人不能相信忙碌的等待。是什么原因?
public class Testme {
public Testme() {
long start = System.currentTimeMillis();
for (int i = 0; i < 10000000L; i++) {}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
public static void main(String[] args) {
new Testme();
}
}
答案 0 :(得分:0)
你绝对不能这样。它不仅在各种处理器上不可靠且不一致,而且可以通过JIT轻松优化。
答案 1 :(得分:0)
很有可能优化并删除空的for循环。
相反,为了节省时间,最好在while循环中使用Thread.sleep(long time)
来检查并确保已经过了正确的时间
long timeToWait = 500;
long startTime = System.currentTimeMillis();
while(startTime + timeToWait > System.currentTimeMillis())
Thread.sleep(startTime + timeToWait - System.currentTimeMillis());
//do stuff after the .5 second wait
另一种方式,不如Thread.sleep()
,是使用while循环直到正确的时间
long timeToWait = 500;
long startTime = System.currentTimeMillis();
while(startTime + timeToWait > System.currentTimeMillis());
//do stuff after the .5 second wait
我也不建议使用内部处理的for循环来尝试通过pipelining传递时间。一旦处理器意识到处理过程中几乎总是如此,检查语句将以超快的速度飞行。