Java - 将观察者模式与计时器任务相结合?

时间:2013-03-27 11:09:41

标签: java design-patterns timer observer-pattern timertask

在上一篇文章中,我使用了观察者模式。说明 -

类Flight具有状态(即int) - 在时间之前,准时,迟到。这是我的Observable FlightStatusMonitor类有一个FlightList。这堂课是我的观察者。只有一个这样的观察者。更新(Observable o,Object arg)方法将更新航班状态,并显示其观察到的所有航班的更新航班状态。

我在考虑使用计时器任务在所选时间更改航班状态,然后查看所有航班的更新状态。

我希望能够在计时器任务更改后立即看到屏幕上显示的航班状态。

但是,我不确定我是否正确地这样做了。并发会成为问题吗?

更新 我有一组航班,其状态我将分批更改。批量大小可以是1次或更多次飞行 - 1,5,15,22,45等但不是所有航班。我改变了一个批次的状态,几秒钟后我改变了另一个批次的状态等。一些航班保持不变。

The related post

2 个答案:

答案 0 :(得分:1)

只要Observer没有使用任何可变状态变量,您就不会遇到并发问题。即使只有在您安排任务相交时,这也是一个问题。我的意思是在前一个完成之前启动一个任务。如果任务按顺序启动,则不会成为问题。

答案 1 :(得分:0)

场景:在计时器事件上通知多个观察者。

方法:

  • 创建Watchdog类,创建计时器和计时器任务。
  • 观察员注册到Watchdog事件。
  • 计时器事件上的监视程序类通知观察者。

下面的示例代码显示了组合计时器任务和观察者的场景:

// 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