Спать до следующей секунды - PullRequest
4 голосов
/ 25 августа 2010

Я часто нахожу необходимость очень часто ждать следующей секунды, чтобы выполнить следующую операцию в серии.Это значительно замедляет юнит-тесты.Итак, вот мой вопрос:

Вместо выполнения Thread.sleep (1000) есть ли более быстрый и эффективный способ спать, пока секунда не изменится на следующую секунду?

Скажите, что время равно 1:00:89

Я сплю одну секунду до 1: 01: 89

Я бы предпочел продолжить выполнение, когда время достигает 1:01 или как можно ближе.

Естьэто возможно?^ _ ^

Ответы [ 2 ]

11 голосов
/ 25 августа 2010

Ну, вы могли бы сделать что-то вроде:

long millisWithinSecond = System.currentTimeMillis() % 1000;
Thread.sleep(1000 - millisWithinSecond);

Это не будет точным, учтите - вам может понадобиться итерация, что немного грязно.

Однако,было бы лучше вообще не спать.Не могли бы вы ввести «службу сна», которая позволила бы вам подделать сны в тестах?(Мне редко нужно было это делать, но я часто вводил фальшивые часы, чтобы сообщать о разных временах.) Какова цель сна в рабочем коде вообще?

1 голос
/ 25 августа 2010

Когда вы говорите «второе», вы имеете в виду второе из системных часов? Вы можете получить текущее время в миллисекундах через System.currentTimeMillis(), затем вычесть это из 1000 и уснуть на эту величину, но имейте в виду, что Thread.sleep () не совсем точен, поэтому не удивляйтесь, если вы перескочите через бит.

...