Ожидание непостоянно?

Я хочу, чтобы в течение определенного промежутка времени был занят цикл ожидания, и я протестировал следующий код 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 ответа

Вы определенно не можете таким образом. Мало того, что он ненадежен и несовместим для разных процессоров, но и может быть легко оптимизирован с помощью JIT.

Существует большая вероятность, что ваш пустой цикл 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 с обработкой внутри, чтобы попытаться скоротать время из-за конвейерной обработки. Оператор проверки будет работать очень быстро, как только процессор поймет, что при обработке он почти всегда будет верным.

Другие вопросы по тегам