#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.
Комментариев нет:
Отправить комментарий