То, что вы сейчас называется занят ждет (также иногда называют опроса), да и его неэффективное с точки зрения использования процессора, а также с точки зрения использования энергии.Вы выполняете код каждый раз, когда OS позволяет это, и при этом он предотвращает использование процессора для других работ или когда нет другой работы, он не позволяет CPU вздремнуть, растрачивая энергию (нагрев процессора, слив батареи ...).
Что вам нужно сделать, это поставить вашу нить спать до тех пор, пока вы не захотите что-то сделать. Это позволяет процессору выполнять другие задачи или переходить в спящий режим.
Существует метод на java.lang.Thread, чтобы сделать именно это: Thread.sleep(long milliseconds)
(у него также есть двоюродный брат с дополнительным параметром nanos, но нанос может игнорироваться VM, и такая точность редко необходима).
Итак, сначала вы определяете , когда вам необходимо выполнить некоторую работу. Затем вы спите до тех пор. Наивная реализация может выглядеть так:
public static void waitUntil(long timestamp) {
long millis = timestamp - System.currentTimeMillis();
// return immediately if time is already in the past
if (millis <= 0)
return;
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
Это прекрасно работает, если вы не слишком строгие требования к точности удара времени, вы можете ожидать, что она вернется достаточно близко к указанному времени (в нескольких десятках мса вероятно,), если время не слишком далеко в будущем (несколько секунд). Однако у вас есть нет гарантий, что иногда, когда ОС действительно занята, что она, возможно, возвращается намного позже.
Несколько более точный метод заключается в определении reuired времени сна, сон в течение половин то время, оценить необходимый сон снова, сон снова половину временем и так далее, пока требуемое время сна не становится очень мало, то ожидают оставшиеся миллисекунды.
Однако System.currentTimeMillis() не гарантирует фактическое разрешение времени; он может меняться один раз в миллисекунду, но он может меняться только каждые десять мс на 10 (это зависит от платформы). То же самое касается System.nanoTime().
Ожидание точного момента времени невозможно на языках программирования высокого уровня в многозадачной среде (практически везде в настоящее время). Если у вас есть строгие требования, вам нужно обратиться к спецификациям операционной системы, чтобы создать прерывание в указанное время и обработать событие в прерывании (что означает ассемблер или не менее C для обработчика прерываний). Вам не нужно, чтобы в большинстве обычных приложений несколько мс +/- обычно не имеют значения в игре/приложении.
Вы знакомы с System.currentTimeMillis? –
В качестве альтернативы вы можете использовать [Таймер] (http://docs.oracle.com/javase/7/docs/api/java/util/Timer.html), так как для этого он предназначен. – Compass
Я уточнил вопрос для более четкого вопроса, но объяснительный ответ Дюрандаля очень удовлетворительный для меня. – ickarsim