【问题标题】:java.util.Observable, will clients complete executing their update() before continuingjava.util.Observable,客户端是否会在继续之前完成其 update() 的执行
【发布时间】:2010-06-01 19:16:43
【问题描述】:

当我打电话时:

setChanged();
notifyObservers();

java.until.Observable 类上,所有监听Observer 对象是否会在java.until.Observable 类继续运行之前完成它们的udpate() 方法的执行——假设我们在同一个线程中运行?

这很重要,因为我将通过 notifyObservers(Object o) 方法快速让步发送一些消息,但重要的是每个 Observer 类都在新方法之前完成了它的方法。

我知道,当我们调用 notifyObservers() 时,每个 Observer 类的执行顺序可能会有所不同——重要的是每个单独实例的方法执行顺序是有序的。

【问题讨论】:

  • Observable 执行观察者的顺序在文档中指定 - 与实际实现完全相反。真的,你根本不想使用Observer/Observable
  • @Tom Hawtin - tackline:它有点原始。 EventListenerList 可能是另一种选择。 java.sun.com/javase/6/docs/api/javax/swing/event/…

标签: java observable


【解决方案1】:

java.util.Observable 对实现者应该做什么提出了很多要求。然而,作为一个接口,这些都没有被强制执行。

notifyObservers(Object o) 的合约是:

如果这个对象发生了变化,正如 hasChanged 方法所指示的,那么通知它的所有观察者,然后调用 clearChanged 方法来指示这个对象不再改变。 每个观察者都有自己的 update 方法,它使用两个参数调用:这个 observable 对象和 arg 参数。

不期望此方法被同步。这意味着如果您在不同的线程中调用notifyObservers(Object o),则不应期望它被同步。

对您的问题更重要的是,也没有相应的期望 java.util.Observer.update(Observable a, Object arg) 在单个线程中完成。这意味着您可以在单个线程中随意调用notifyObservers(Object o),但Observer.update(Observable a, Object arg) 可能正在生成线程。如果是这种情况,您无法保证它开始的工作何时完成。

如果您同时编写 ObserversObservables 并且没有生成线程,则可以确定每次对 notifyObservers(Object o) 的调用将仅在对 update(Observable o, Object arg) 的最后一次调用完成后完成。

【讨论】:

    【解决方案2】:

    Observable 没有任何异步或线程。我建议,如果您的 update() 方法需要很长时间,那么您让它们将所需的任何信息放入某种队列中,然后启动一个线程以将下一个任务从队列中弹出并执行。 Java 1.6 中引入了一些不错的线程安全队列结构,它们应该可以解决问题。

    【讨论】:

      【解决方案3】:

      假设notifyObservers()-方法将通知所有注册的观察者......是的......因为你的方法调用是同步的,即当notifyObserver()方法返回时你的方法将继续执行。 notifyObserver() 在完成遍历所有观察者并调用他们的update()-方法后返回。

      【讨论】:

      • 这是正确的。它不保证 notifyObserver() 不会启动异步操作。
      【解决方案4】:

      Observable 类中提供的默认实现将按照他们注册感兴趣的顺序通知观察者,但子类可以更改此顺序,使用不保证顺序,在单独的线程上传递通知,或者可以保证它们的子类按照他们的选择,按照这个顺序。”您的子类应指定做出的选择。如果它保留默认值,则适用@Jacob Tomaw 的分析。

      作为implementation detail,“我们从 Vector 中提取每个 Observable 并存储 Observer 状态的代码需要同步,但通知观察者不需要(不应该)。”

      【讨论】:

        猜你喜欢
        • 2018-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多