忙等待不一致吗?

时间:2015-11-13 15:47:12

标签: java busy-waiting busy-loop

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

2 个答案:

答案 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传递时间。一旦处理器意识到处理过程中几乎总是如此,检查语句将以超快的速度飞行。

相关问题