2010-06-01 96 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的狀態需要同步,但通知觀察者不會(不應該)的代碼。」