Java в реальном времени - не удается запустить обработчик асинхронных событий
Следующий код адаптирован из примера в программировании на платформе Java в реальном времени Питера С. Диббла:
import javax.realtime.*;
public class OSTimer {
static volatile boolean cont = true;
public static void main(String[] args) {
AsyncEventHandler handler = new AsyncEventHandler(){
public void handleAsyncEvent() {
System.out.println("Stopping...");
cont = false;
}
}
};
OneShotTimer timer = new OneShotTimer(new RelativeTime(3000, 0), handler);
timer.start();
while(cont){
System.out.println("Running");
if (timer.isRunning()) System.out.println("Timer is running");
try {
Thread.sleep(1000);
} catch(Exception e) { }
}
System.exit(0);
}
Программа должна работать в течение 3 секунд, а затем выйти. Однако выходные данные показывают, что, хотя таймер действительно остановился через 3 секунды, программа продолжает работать как обычно, то есть вывод:
Running
Timer is running
Running
Timer is running
Running
Timer is running
Running
Running
Running......
Ясно, что обработчик не сработал, и я понятия не имею, почему. Другая программа-пример, включающая периодический таймер, запускающий обработчик, работает как положено. Структура программы почти такая же, как здесь.
1 ответ
Несколько вещей, чтобы попробовать:
- Вызов
fire()
явно на экземпляре таймера, чтобы увидеть, если вы можете заставить вещи - Попробуйте создать свой обработчик, передавая логику как
Runnable
объект к обработчику. API немного неясен в этом вопросе, но именно так я указывал обработчики в прошлом.
Пример:
AsyncEventHandler handler = new AsyncEventHandler(new Runnable() {
public void run() {
System.out.println("Stopping...");
cont = false;
}
});