1

我想要一个特定时间的繁忙等待循环,我测试了以下 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();
    }
}
4

2 回答 2

0

您的空 for 循环很有可能会被优化和删除。

相反,为了消磨时间,最好Thread.sleep(long time)在 while 循环内使用来检查并确保经过了正确的时间

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 循环来尝试通过流水线处理时间。一旦处理器意识到它在处理过程中几乎总是正确的,检查语句就会飞得很快。

于 2015-11-13T16:01:04.273 回答
0

你绝对不能这样。它不仅在各种处理器之间不可靠且不一致,而且可以通过 JIT 轻松优化。

于 2015-11-13T15:59:11.003 回答