Сон нити и точное время

Я делаю код, в котором мне нужна определенная точность времени. Я использую робота для выполнения некоторых действий, затем использую Thread.sleep(some_time), чтобы some_time проходил между действиями. Но я не получаю лучших результатов, потому что когда я ищу, sleep неточно. Как лучше всего этого добиться? Я имею в виду симулировать Thread.sleep другими методами.


person Community    schedule 19.04.2014    source источник
comment
введите это точное время java в поисковую систему ...   -  person Mitch Wheat    schedule 19.04.2014
comment
Вы можете проверить разницу во времени, используя текущее время системы.   -  person Braj    schedule 19.04.2014
comment
Ни Java, ни C, ни C ++ не могут дать никаких гарантий, кроме тех, которые дает операционная система. Если вам нужно поведение в реальном времени, вам нужна операционная система реального времени.   -  person user207421    schedule 19.04.2014
comment
@Bratty Вы можете вызывать C / C ++ из Java, на самом деле это то, что делает Thread.sleep (), вы можете объяснить, что вы имеете в виду?   -  person Peter Lawrey    schedule 19.04.2014
comment
Какая точность вам нужна? Точность sleep () редко является реальной проблемой, поэтому она не более точна, чем предоставляет ОС.   -  person Peter Lawrey    schedule 19.04.2014
comment
@PeterLawrey - Читая между строк, ОП, скорее всего, хочет, чтобы его поток приложения просыпался с точностью до 1 миллисекунды или лучше ... чтобы избежать проскакивания робота при каком-либо физическом движении. Жесткий материал в реальном времени. Настоящая проблема заключается в том, что ОС, работающая не в режиме реального времени, не может гарантировать пробуждение менее чем за миллисекунду.   -  person Stephen C    schedule 19.04.2014
comment
@StephenC Проблема в том, что; даже если вы не ложитесь спать и используете ЦП на 100%, вы можете получить 5 мс задержек на Linux-машине. В linux вы можете изолировать процессор и ждать времени, и вы получите около 10 микросекундных скачков во времени.   -  person Peter Lawrey    schedule 19.04.2014
comment
Один из вариантов - проснуться примерно за 5 мс до истечения тайм-аута и начать замедление, чтобы у вас был очень небольшой шанс выйти за пределы допустимого диапазона. т.е. разработать допуск к джиттеру в несколько мс.   -  person Peter Lawrey    schedule 19.04.2014
comment
Я думаю, что это отличается от отмеченного дубликата: Другой вопрос только спрашивает, насколько точен Thread.sleep, в то время как этот вопрос здесь требует альтернативы приближается сон. На оба вопроса должны быть разные ответы.   -  person bluenote10    schedule 24.02.2016


Ответы (2)


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

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

Например, если вам нужно «точное» время, вы можете вместо этого использовать ScheduledExecutorService, который использует службу планирования ОС для обеспечения точности не менее миллисекунд, а часто даже наносекунд. Хотя это неточно до наносекунды (несмотря на предложение), обычно он будет намного точнее, чем Thread.sleep. Но и то, и другое не будет точным в сильно перегруженной системе. Если этого достаточно для решения вашей проблемы, вам следует пойти с этим. В противном случае вам понадобится другой язык / среда исполнения.

person TwoThe    schedule 20.04.2014

Фактически, Java использует средства ОС для реализации своих таймеров 1. Настоящая причина того, что точность таймеров не превышает 1 миллисекунду, заключается в том, что это предел того, что предоставляет типичная (не в реальном времени) ОС. И даже если бы разрешение по времени было более точным, ОС по-прежнему не могла гарантировать «разбудить» пользовательский процесс точно в то время, которое запрашивало приложение.

Если вам нужно реальное (то есть жесткое) поведение в реальном времени, включая высокоточные таймеры и часы, вам нужна ОС реального времени, и вам нужно запустить Java в реальном времени на нем.


1 - это те же средства ОС, что и библиотеки C и C ++. Так что простой переход на C или C ++ мало поможет.

person Stephen C    schedule 19.04.2014