在上一篇文章中,我使用了观察者模式。说明 -
类Flight具有状态(即int) - 在时间之前,准时,迟到。这是我的Observable FlightStatusMonitor类有一个FlightList。这堂课是我的观察者。只有一个这样的观察者。更新(Observable o,Object arg)方法将更新航班状态,并显示其观察到的所有航班的更新航班状态。
我在考虑使用计时器任务在所选时间更改航班状态,然后查看所有航班的更新状态。
我希望能够在计时器任务更改后立即看到屏幕上显示的航班状态。
但是,我不确定我是否正确地这样做了。并发会成为问题吗?
更新 我有一组航班,其状态我将分批更改。批量大小可以是1次或更多次飞行 - 1,5,15,22,45等但不是所有航班。我改变了一个批次的状态,几秒钟后我改变了另一个批次的状态等。一些航班保持不变。
答案 0 :(得分:1)
只要Observer
没有使用任何可变状态变量,您就不会遇到并发问题。即使只有在您安排任务相交时,这也是一个问题。我的意思是在前一个完成之前启动一个任务。如果任务按顺序启动,则不会成为问题。
答案 1 :(得分:0)
场景:在计时器事件上通知多个观察者。
方法:
下面的示例代码显示了组合计时器任务和观察者的场景:
// WatchDog.java
import java.util.Observable;
import java.util.Observer;
import java.util.Timer;
import java.util.TimerTask;
// Observer class
class Observer1 implements Observer{
@Override
public void update(Observable arg0, Object arg1) {
System.out.println("Observer1 notified");
}
}
// Watchdog Component which creates the timer and notifies the timers.
public class WatchDog extends Observable {
Timer timer;
int seconds;
// Notify task to notify observers
class NotifyTask extends TimerTask{
@Override
public void run() {
setChanged();
notifyObservers();
}
}
public WatchDog( ) {
timer = new Timer();
}
public void schedule(long seconds){
timer.scheduleAtFixedRate(new NotifyTask(), 0, seconds*1000); //delay in milliseconds
}
public void stop(){
timer.cancel();
}
public static void main(String args[]) throws InterruptedException {
Observer1 observer1 = new Observer1();
WatchDog watchDog = new WatchDog();
// register with observer
watchDog.addObserver(observer1);
System.out.println("WatchDog is scheduled.");
watchDog.schedule(5);
Thread.sleep(25000);
watchDog.stop();
}
}
有关完整的详细信息,请参阅文章: Java timers and observer