Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

Java делает паузу на неточное количество миллисекунд

#java #sleep


Есть некое ПО, в котором генерируются события. ПО предоставляет две функции: GetEvents
и GetData. Сценарий такой: сначала выполняется GetEvents, проходит какое-то время,
после выполняется GetData, который возвращает информацию о всех произошедших между
вызовом этих двух функций событиях. 
Задача стоит следующая: каждые 15 секунд получать информацию о всех событиях, произошедших
за эти 15 секунд. Был написан следующий фрагмент кода на Java:

public void fun(){
    Thread thread = new Thread(new Runnable() {
        public void run() {
            GetEvents();
            TimeUnit.MILLISECONDS.sleep(15000);
            System.out.println(GetData());
        }
    });
    thread.start();
}

public static void Main(String args[]) {
    for (;;) {
        fun();
        TimeUnit.MILLISECONDS.sleep(15000);
    }
}  


Проблема заключается в том, что Java чаще всего делает паузу не ровно на 15000 миллисекунд,
а немного больше или меньше (на 15-20 миллисекунд). Из-за этого вывод некоторых событий
дублируется, а некоторые не регистрируются вообще. Подскажите, пожалуйста, как можно
решить эту проблему? Других функций для получения событий, к сожалению, нет.
    


Ответы

Ответ 1



Никак. Поток в любое время может быть приостановлен системным планировщиком потоков, так что никаких гарантий нет. Хуже того, спящий поток будет гарантировано приостановлен планировщиком. Гарантии по пробуждению потоков в срок может дать вам лишь real-time OS, которой ваша платформа скорее всего не является. Переделайте дизайн так, чтобы он не рассчитывал на пробуждение точно в нужный момент. Синхронизация между потоками делается не так. Рассчитывать на таймер нельзя. В Java для таких целей есть синхронизационные примитивы. Например, блок synchronized, Semaphore или CyclicBarrier. Загляните сюда: java.util.concurrent.

Комментариев нет:

Отправить комментарий