java.util.Observable,客户端是否会在继续之前完成更新()的执行

java.util.Observable,客户端是否会在继续之前完成更新()的执行,java,observable,Java,Observable,当我打电话时: setChanged(); notifyObservers(); 在java.until.Observable类上,假设我们在同一线程中运行,java.until.Observable类继续运行之前,所有侦听的观察者对象是否会完成其udpate()方法的执行 这一点很重要,因为我将通过quick Rective中的notifyObservators(Object o)方法发送一些消息,但是每个Observator类在新类之前完成其方法是很重要的 我理解,当我们调用notifyo

当我打电话时:

setChanged();
notifyObservers();
java.until.Observable
类上,假设我们在同一线程中运行,
java.until.Observable
类继续运行之前,所有侦听的观察者对象是否会完成其udpate()方法的执行

这一点很重要,因为我将通过quick Rective中的
notifyObservators(Object o)
方法发送一些消息,但是每个Observator类在新类之前完成其方法是很重要的


我理解,当我们调用
notifyobserver()
,每个观察者类的执行顺序可能会有所不同-每个实例的方法执行顺序是有序的非常重要。

假设
notifyobserver()
-方法将通知所有注册的观察者。。。对因为方法调用是同步的,即当
notifyObserver()
方法返回时,方法的执行将继续。
notifyObserver()
完成对所有观察者的迭代并调用其
update()
-方法后返回。

可观察对象没有异步或线程化。我建议,如果update()方法花费的时间太长,那就是让它们将所需的任何信息放到某种队列中,然后启动一个线程,从队列中弹出下一个任务并执行它。Java 1.6中引入了一些很好的线程安全队列结构,它们应该可以做到这一点。

Java.util.Observable
对实现者应该做的事情提出了很多要求。但是,作为一个接口,这些都不是强制的

通知观察员(对象o)
的合同是:

如果此对象已更改,如hasChanged方法所示,则通知其所有观察者,然后调用clearChanged方法以指示此对象已不再更改。 每个观察者都使用两个参数调用其更新方法:此可观察对象和arg参数

不希望同步此方法。这意味着,如果在不同的线程中调用
notifyobservators(对象o)
,则不应期望同步

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

如果您正在编写
观察者
观察者
,并且您没有生成线程,那么可以确保对
notifyobservators(Object o)
的每次调用都将仅在最后一次调用
update(observate o,Object arg)
完成后完成

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


作为一个例子,“我们从向量中提取每个可观察对象并存储观察者状态的代码需要同步,但通知观察者不需要(不应该)。”

这是正确的。它不保证notifyObserver()不会启动异步操作。文档中指定了通过
Observable
执行观察器的顺序-与实际实现完全相反。真的,你根本不想使用
观察者
/
可观察的
。@Tom Hawtin-tackline:这有点原始<代码>事件列表列表可能是一种替代方案。