Каков наилучший способ подсчета временных интервалов? - PullRequest
1 голос
/ 26 января 2011

Если я напишу приложение Clock и мне нужно увеличивать значение short seconds буквально через каждую секунду, могу ли я положиться на метод Thread.sleep(1000)?

Будет ли это нормально работать, если бы у меня были миллионы часов, работающих одновременно?

Ответы [ 3 ]

2 голосов
/ 26 января 2011

Нет, вы не можете полагаться на Thread.sleep (1000), так как это зависит от планировщика ЦП относительно того, когда ваш поток действительно будет запущен в следующий раз.

Кроме того, тайминги ЦП не совсем точны , поэтому вы получите естественное отклонение от истинного времени, если вы не синхронизируете с надлежащей службой времени (атомные часы).

Сказав, что, однако, если вы действительно намереваетесь запустить «миллионы часов», вам будет лучше иметь один обновляемый таймер и просто хранить смещение этого таймера в каждом экземпляре часов.

Кроме того, сокращая время, в течение которого поток спит, и обновляя секунды только по мере необходимости, вы можете повысить свою точность. Обратите внимание, что, как упоминалось выше, время ожидания составляет , а не гарантируется . Это означает, что даже если вы попросили его поспать 10 мс, технически возможно, чтобы он не вернулся через 10 секунд (или, <<insert arbitrary time here>>

0 голосов
/ 05 февраля 2011

Посмотрите на пакет Java Concurrent API.Существует ряд новых API, которые работают с многопоточными и неблокирующими алгоритмами.

Например, вместо вызова вашей программы Thread.sleep (1000) вы можете настроить [ScheduledExecutorService] [1]и запланируйте задачу для запуска каждую секунду.Это вызовет ваш код, и вы будете использовать его для обновления тиков.Это переместит ваш код в более производительную / потребительскую модель.

В Java 5 устранена необходимость в таком низкоуровневом доступе к потоку (т. Е. Ожидание / уведомление).Взгляните на некоторые новые элементы в пакете Java Concurrent

[1]: http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit)

0 голосов
/ 26 января 2011

Как правило, вы хотите обновить счетчик секунд, по крайней мере, пару раз в секунду, в противном случае это может быть почти целая секунда, не синхронизированная с реальными часами.

Если это вообще возможно, оттуда выхотите иметь только один поток, спящий и обновляющий значение seconds, и иметь приоритетную очередь событий, которые необходимо обслуживать.При каждом обновлении часы смотрят на событие в начале очереди с приоритетами и, если вы достигли его времени, обрабатывают его и проверяют следующее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...