java.util.Observable中,继续
之前将客户完整的执行它们的更新()当我喊:java.util.Observable中,继续
setChanged();
notifyObservers();
在java.until.Observable
类,将所有的聆听观察对象的UDPATE的完整执行()方法 - 假设我们在同一个线程中运行 - 在java.until.Observable
类继续运行之前?
这很重要,因为我将在快速让步中通过notifyObservers(Object o)
方法发送一些消息,但重要的是每个Observer类在新的之前完成其方法。
我明白,当我们调用notifyObservers()
执行每个观察类的顺序可能会有所不同 - 它仅仅是重要的方法执行的每个单独的实例的顺序是为了。
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)
可能会产生线程。如果是这种情况,你不能保证它开始的工作何时完成。
如果你正在写两个Observers
和Observables
,你是不是产卵线程,你可以肯定的是每次调用notifyObservers(Object o)
将只update(Observable o, Object arg)
完成最后一次通话后完成。 “
假设notifyObservers()
-method将通知所有注册的观察者...是...因为您的方法调用是同步的,即当notifyObserver()
方法返回时,您的方法的执行将继续。 notifyObserver()
在完成遍历所有观察者并返回update()
-方法时返回。
这是真实的和正确的。它不保证异步操作不是由notifyObserver()开始的。 – DJClayworth 2010-06-01 20:22:19
关于Observable没有任何异步或线程。我建议如果你的update()方法花费很长时间,你会让他们在某种类型的队列中放置任何需要的信息,并且释放一个线程以将下一个任务从队列中弹出并执行。在Java 1.6中引入了一些非常好的线程安全队列结构,应该可以做到这一点。
”Observable
类中提供的默认实现将按其注册兴趣的顺序通知观察者,但子类可能会更改此顺序,不使用保证顺序,在单独的线程上传递通知,或者可能保证其子类遵循这个顺序,他们选择。“你的子类应该指定做出了哪个选择。如果它保留默认值,则@Jacob Tomaw的分析适用。
作为一个implementation detail,“我们从Vector中提取每个Observable并存储Observer的状态需要同步,但通知观察者不会(不应该)的代码。”
通过'Observable'执行观察者的次序在文档中指定 - 与实际实现完全相反。真的,你根本不想使用'Observer' /'Observable'。 – 2010-06-02 02:01:18
@汤姆霍廷 - 斜线:它本身就是一个小小的原始。 'EventListenerList'可能是另一种选择。 http://java.sun.com/javase/6/docs/api/javax/swing/event/EventListenerList.html – trashgod 2010-06-04 19:27:24