【问题标题】:Java - Combine Observer pattern with timer task?Java - 将观察者模式与计时器任务相结合?
【发布时间】:2013-03-27 11:09:41
【问题描述】:

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

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

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

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

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

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

The related post

【问题讨论】:

  • 如果你要同时改变所有个航班的状态,观察者模式是没用的。您不妨在监视器中放置一个计时器,并在它触发时检查所有航班。
  • @Heuster - 我有一组航班的状态分批更改。批量大小可以是 1 个航班或更多 - 1 、 5 、 15 、22 、 45 等,但绝不是所有航班。我更改了一批的状态,几秒钟后我更改了另一批的状态等。一些航班保持不变。观察者模式适用于这个用例吗?
  • 是的,那就太好了。如果更改的数量明显小于航班总数,则观察者模式将获得回报。此外,您可能希望批量缓存更改并一次更新它们(当航班通知更改时,请稍等片刻 - 例如一秒钟 - 并将在该时间间隔内到达的所有通知添加到同一批次中。然后,一次更新整个批次的屏幕。)

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


【解决方案1】:

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

【讨论】:

  • 可变状态变量 - 我不明白。请解释。有些任务在同一时间启动,有些则在另一个时间启动。
  • 我现在接受这个答案。希望你能回复我的评论
  • 可变状态变量是指可以修改的实例或静态变量。如果您的所有变量都是方法范围的。这意味着只存在于方法中,您无需担心。
【解决方案2】:

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

方法:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 2011-03-22
    • 2010-12-24
    • 1970-01-01
    • 2010-09-23
    • 2014-10-14
    相关资源
    最近更新 更多