4

私が電話するとき:

setChanged();
notifyObservers();

クラスで、リスニングしているjava.until.Observableすべてのオブザーバー オブジェクトは、同じスレッドで実行していると仮定して、クラスが実行を継続する前に、udpate() メソッドの実行を完了しjava.until.Observableますか?

これは重要ですnotifyObservers(Object o)。簡単な譲歩でメソッドを介していくつかのメッセージを送信するためです。ただし、各 Observer クラスが新しいメソッドよりも前にメソッドを終了することが重要です。

各 Observer クラスの実行順序は呼び出し時に異なる場合があることを理解していnotifyObservers()ます。個々のインスタンスのメソッド実行順序が正しいことだけが重要です。

4

4 に答える 4

4

java.util.Observable実装者が何をすることが期待されているかについて多くの主張をします。ただし、インターフェイスとして、これは強制されません。

の契約notifyObservers(Object o)は次のとおりです。

hasChanged メソッドによって示されるように、このオブジェクトが変更された場合は、すべてのオブザーバーに通知してから、clearChanged メソッドを呼び出して、このオブジェクトが変更されていないことを示します。各オブザーバーには、この監視可能なオブジェクトと arg 引数の 2 つの引数で呼び出される更新メソッドがあります。

このメソッドが同期されることは想定されていません。これは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)

于 2010-06-01T20:07:12.663 に答える
2

Observable については、非同期またはスレッド化されたものは何もありません。update() メソッドに時間がかかりすぎる場合は、必要な情報を何らかのキューに入れ、スレッドを起動して次のタスクをキューからポップして実行することをお勧めします。Java 1.6 で導入されたスレッド セーフなキュー構造がいくつかあります。

于 2010-06-01T19:26:03.470 に答える
0

「クラスで提供されるデフォルトの実装は、Observable関心を登録した順序でオブザーバーに通知しますが、サブクラスはこの順序を変更したり、保証された順序を使用したり、別のスレッドで通知を配信したり、サブクラスがこの順序に従うことを保証したりできます。選ぶ。" サブクラスは、どの選択が行われたかを指定する必要があります。デフォルトを保持する場合、@Jacob Tomaw の分析が適用されます。

実装の詳細として、「Vector から各 Observable を抽出し、Observer の状態を格納するコードは同期が必要ですが、Observer に通知する必要はありません (すべきではありません)」。

于 2010-06-02T02:24:38.843 に答える
0

-method が登録されているすべてのオブザーバーに通知すると仮定すると...はい...メソッド呼び出しは同期的であるため、つまり、メソッドが返さnotifyObservers()れたときにメソッドの実行が続行されるためです。notifyObserver()すべてのnotifyObserver()オブザーバーを繰り返し処理し、それらのメソッドを呼び出すのが完了すると、 は戻りますupdate()

于 2010-06-01T19:25:01.137 に答える