2

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

类 Flight 有一个状态(即 int)——在时间之前,准时,迟到。这是我的 Observable 类 FlightStatusMonitor 有一个航班的 ArrayList。这个班级是我的观察者。这样的观察者只有一个。update(Observable o, Object arg) 方法将更新航班的状态,并显示它观察到的所有航班的刷新航班状态。

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

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

但是,我不确定我这样做是否正确。并发在这里会是一个问题吗?

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

相关帖子

4

2 回答 2

1

只要Observer不使用任何可变状态变量,您就不会遇到并发问题。只有当您计划任务相交时,这也是一个问题。我的意思是在前一个任务完成之前开始一个任务。如果任务是按顺序启动的,那将不是问题。

于 2013-03-27T11:16:07.457 回答
0

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

方法 :

  • 创建看门狗类,它创建定时器和定时器任务。
  • 观察者注册到看门狗事件。
  • 计时器事件上的看门狗类通知观察者。

下面的示例代码展示了结合定时器任务和观察者的场景:

//看门狗.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 计时器和观察者

于 2015-06-12T13:01:51.827 回答