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