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