java.util.Observable,客户端会在继续之前完成执行update()

时间:2010-06-01 19:16:44

标签: java observable

我打电话的时候:

setChanged();
notifyObservers();

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

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

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

4 个答案:

答案 0 :(得分:4)

java.util.Observable对实施者应该做什么提出了很多要求。但是作为一个接口,没有一个是强制执行的。

notifyObservers(Object o)的合同是:

  

如果此对象已更改(如hasChanged方法所示),则通知其所有观察者,然后调用clearChanged方法以指示此对象不再更改。   每个观察者都使用两个参数调用其update方法:this observable object和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)的调用仅在最后一次调用{ {1}}结束。

答案 1 :(得分:1)

Observable没有任何异步或线程。我建议如果你的update()方法花费很长时间,你可以让它们在某种队列中放置所需的任何信息,并触发一个线程从队列中弹出下一个任务并执行它。 Java 1.6中引入了一些很好的线程安全队列结构,可以解决这个问题。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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