2010-06-01 65 views
3

之前将客户完整的执行它们的更新()当我喊:java.util.Observable中,继续

setChanged(); 
notifyObservers(); 

java.until.Observable类,将所有的聆听观察对象的UDPATE的完整执行()方法 - 假设我们在同一个线程中运行 - 在java.until.Observable类继续运行之前?

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

我明白,当我们调用notifyObservers()执行每个观察类的顺序可能会有所不同 - 它仅仅是重要的方法执行的每个单独的实例的顺序是为了。

+0

通过'Observable'执行观察者的次序在文档中指定 - 与实际实现完全相反。真的,你根本不想使用'Observer' /'Observable'。 – 2010-06-02 02:01:18

+0

@汤姆霍廷 - 斜线:它本身就是一个小小的原始。 'EventListenerList'可能是另一种选择。 http://java.sun.com/javase/6/docs/api/javax/swing/event/EventListenerList.html – trashgod 2010-06-04 19:27:24

回答

3

java.util.Observable对实施者预计要做什么提出了很多要求。然而作为一个接口,没有一个是强制的。

notifyObservers(Object o)的合同是:

如果该对象发生了变化,由hasChanged方法指示,则通知其所有观察者,并调用clearChanged方法来指示该对象不再改变。 每个观察者都使用两个参数调用其更新方法:此可观察对象和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)完成最后一次通话后完成。 “

0

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

+0

这是真实的和正确的。它不保证异步操作不是由notifyObserver()开始的。 – DJClayworth 2010-06-01 20:22:19

1

关于Observable没有任何异步或线程。我建议如果你的update()方法花费很长时间,你会让他们在某种类型的队列中放置任何需要的信息,并且释放一个线程以将下一个任务从队列中弹出并执行。在Java 1.6中引入了一些非常好的线程安全队列结构,应该可以做到这一点。

0

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

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