Я делаю код, в котором мне нужна определенная точность времени. Я использую робота для выполнения некоторых действий, затем использую Thread.sleep(some_time)
, чтобы some_time
проходил между действиями. Но я не получаю лучших результатов, потому что когда я ищу, sleep
неточно. Как лучше всего этого добиться? Я имею в виду симулировать Thread.sleep
другими методами.
Сон нити и точное время
Ответы (2)
Время в современных ОС никогда не бывает точным, если вы не используете язык / фреймворк, специально предназначенный для этого. Однако вы можете работать с разумной неопределенностью в большинстве операционных систем. Но «разумный» зависит от проблемы, которую вы пытаетесь решить.
В Java Thread.sleep - очень простая реализация, которая, на мой взгляд, слишком часто используется. Java предлагает эти базовые инструменты многопоточности не потому, что они являются лучшим решением, а потому, что они являются основными инструментами. Java также предлагает множество других, более сложных инструментов, которые могут лучше удовлетворить ваши потребности.
Например, если вам нужно «точное» время, вы можете вместо этого использовать ScheduledExecutorService, который использует службу планирования ОС для обеспечения точности не менее миллисекунд, а часто даже наносекунд. Хотя это неточно до наносекунды (несмотря на предложение), обычно он будет намного точнее, чем Thread.sleep. Но и то, и другое не будет точным в сильно перегруженной системе. Если этого достаточно для решения вашей проблемы, вам следует пойти с этим. В противном случае вам понадобится другой язык / среда исполнения.
Фактически, Java использует средства ОС для реализации своих таймеров 1. Настоящая причина того, что точность таймеров не превышает 1 миллисекунду, заключается в том, что это предел того, что предоставляет типичная (не в реальном времени) ОС. И даже если бы разрешение по времени было более точным, ОС по-прежнему не могла гарантировать «разбудить» пользовательский процесс точно в то время, которое запрашивало приложение.
Если вам нужно реальное (то есть жесткое) поведение в реальном времени, включая высокоточные таймеры и часы, вам нужна ОС реального времени, и вам нужно запустить Java в реальном времени на нем.
1 - это те же средства ОС, что и библиотеки C и C ++. Так что простой переход на C или C ++ мало поможет.
Thread.sleep
, в то время как этот вопрос здесь требует альтернативы приближается сон. На оба вопроса должны быть разные ответы. - person bluenote10   schedule 24.02.2016