4

当我打电话时:

setChanged();
notifyObservers();

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

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

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

4

4 回答 4

4

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)可能会产生线程。如果是这种情况,您无法保证它开始的工作何时完成。

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

于 2010-06-01T20:07:12.663 回答
2

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

于 2010-06-01T19:26:03.470 回答
0

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

于 2010-06-01T19:25:01.137 回答
0

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

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

于 2010-06-02T02:24:38.843 回答