Вы никогда не должны пытаться сделать это. Спросите себя, действительно ли вам нужно спать один такт. Связывание реализации с таймерами — всегда плохое решение. Ниже я даю вам несколько альтернатив.
Использовать механизм аналогичный fps в реализации игр
В ряде библиотек уже реализована концепция fps. Обычно их реализация уже абстрагируется от часов в секунду и ограничений/деталей ОС. Вы можете использовать эту концепцию и не зависеть от платформы.
Таким образом, вы можете настроить требования к времени, используя большее или меньшее количество кадров в секунду.
Используйте мьютекс.
Почему нужно спать один цикл? Это очень маленький срок. Вы можете попытаться синхронизировать (если это так), используя мьютексы вместо таймеров.
Кроме того, мьютексы обычно реализуются аппаратными инструкциями. Так что это гарантирует, что они атомарны. Если вам действительно нужно спать в течение бесконечно малого времени, вы можете заблокировать мьютекс, а затем разблокировать его. Честно говоря, любой код, который вы выполняете, по определению (если это не NOOP) будет подобен спящему на один цикл. Вы также можете использовать tmp = 1+1
. Это требует двух инструкций.
Я предлагаю мьютекс. Из вашего вопроса непонятно, зачем вам это время сна.
Mutex с взаимодействием с пользователем
Если вам нужно дождаться взаимодействия с пользователем (или любого внешнего события, например запросов), заблокируйте мьютекс и разблокируйте его только тогда, когда событие или пользовательский ввод станет доступным.
Получить значение таймера
Если вы действительно хотите пойти по пути таймера, я предлагаю вам реализовать подпрограмму, которая выполняет длинный цикл for, а затем вы можете попытаться вывести свой таймер из времени, которое потребовалось для прохождения этого цикла for.
Как я уже говорил ранее, я не считаю этот подход надежным, но он хоть что-то. Кроме того, я предлагаю вам также защитить этот код, используя сочетание методов надежности Монте-Карло и модульных тестов. Подробнее об этом можно прочитать в этой статье.
И последнее замечание: остерегайтесь оптимизаций, которые может сделать компилятор/интерпретатор, и испортите свой таймер.
person
cenouro
schedule
24.09.2015
Thread.sleep
гарантирует сон в течение минимум указанного времени (за исключением ложных пробуждений). Просто не гарантируется сон только так долго. Общее эмпирическое правило заключается в том, что гранулярность составляет около 15 мс. - person Boris the Spider   schedule 24.09.2015wait()
? - person Cinnam   schedule 24.09.2015ScheduledThreadPoolExecutor
,javax.swing.Timer
,...), либо совершаете ошибку. - person Solomon Slow   schedule 24.09.2015