LINUX.ORG.RU

[java][Время] Работа по точному времени.

 ,


0

1

Добрый день.
Задача: запуск событий по времени.
Для того, чтобы время было точное использую ntp и библиотеку ntp от Apache.
По-скольку джава, к сожалению, не сможет без рутовых и админских прав поменять системное - приходится делать вот примерно такую штуку:

Отдельный поток, при иницилизации которого был объявлен календарь с текущем временем, это время было синхронизировано с ntp-сервером, а потом пока программа запущена - Thread.sleep на 1 секунду и добавляем к нашему значению часов 1 секунду.

Вот теперь и вопрос - это нормально или все же костыль?
Есть более разумные аналоги подобного алгоритма?

★★★

> Задача: запуск событий по времени.

могу предложить java.util.Timer на нужную задержку. только там ньюанс есть -

Corresponding to each Timer object is a single background thread that is used to execute all of the timer's tasks, sequentially. Timer tasks should complete quickly. If a timer task takes excessive time to complete, it «hogs» the timer's task execution thread.

isden ★★★★★
()

Вообще, это в принципе не задача приложения. Просто надо в документации написать, что время в системе должно быть синхронизировано. Однако, бывает всякое и если очень надо, то лучше использовать не Thread.sleep, а ориентироваться на тики от java.util.Timer (если память мне не изменяет) и периодически синхронизироваться с сервером. Если резкие скачки недопустимы, то просто делать тики таймера чаще/реже.

Zenom ★★★
()
Ответ на: комментарий от isden

Спасибо огромное, подсказали про Timer и решение задачи в принципе. Теперь на основе данных ntp клиента будет менятся время старта события. Огромное спасибо.

fjfalcon ★★★
() автор топика

>Thread.sleep на 1 секунду и добавляем к нашему значению часов 1 секунду.
времени проходит больше, чем 1 секунда, ибо остальные операции не мгновенны, попробуй считать по милисекундам и микросекундам.

dimon555 ★★★★★
()

Это костыль. Более нормальное решение - хранить и периодически обновлять расхождение времени. Тогда для вычисления текущего времени нужно будет просто прибавить расхождение к системному времени.

dmitry_vk ★★★
()

Thread.sleep(1) не гарантирует точность, расхождение быстро накопится.

Кроме Timer, есть SchedulerThreadPoolExecutor в котором решены многие недостатки Timer'а

maxcom ★★★★★
()

Если важна высокая точность времени, лучше выполнять синхронизацию с NTP сервером часто, например раз в 5-10 минут. Любой кварцевый генератор неидеален, поэтому время в системе постоянно «плывет» и требует периодической синхронизации.

m0rph ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.