2010-06-01 2 views
3

Когда я зовем:java.util.Observable, будут клиенты полного выполнения их обновления(), прежде чем продолжить

setChanged(); 
notifyObservers(); 

на java.until.Observable класса, будет все объекты слушающего наблюдателя полного исполнения их udpate) методы (- предположим, что мы работаем в одной теме - до того, как класс java.until.Observable продолжает работать?

Это важно, потому что я буду отправлять несколько сообщений через метод notifyObservers(Object o) в быстрой уступке, важно, чтобы каждый класс Observer завершил свой метод до нового.

Я понимаю, что порядок выполнения для каждого класса Observer может меняться, когда мы вызываем notifyObservers() - важно, чтобы порядок выполнения метода для каждого отдельного экземпляра был в порядке.

+0

Порядок выполнения наблюдателями 'Observable' указан в документации - является полной противоположностью фактической реализации. На самом деле, вы не хотите использовать 'Observer' /' Observable' вообще. –

+0

@Tom Hawtin - tackline: Это _is_ немного исконно. «EventListenerList» может быть альтернативой. http://java.sun.com/javase/6/docs/api/javax/swing/event/EventListenerList.html – trashgod

ответ

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) может быть нереститься. Если это так, вы не можете гарантировать, когда закончит работу.

Если вы пишете как Observers и Observables и вы не порождая темы, вы можете быть уверены, что каждый вызов notifyObservers(Object o) завершится только после последнего вызова update(Observable o, Object arg) отделки.

0

Предполагая, что метод notifyObservers() будет уведомлять всех зарегистрированных наблюдателей ... да ... потому что вызовы вашего метода синхронны, то есть выполнение вашего метода будет продолжаться, когда возвращается метод notifyObserver(). notifyObserver() возвращается, когда он закончил, чтобы перебирать всех наблюдателей и называть их update()-способами.

+0

Это верно и правильно. Это не гарантирует, что асинхронные операции не будут начаты notifyObserver(). – DJClayworth

1

В Observable нет ничего асинхронного или резьбового. Я бы предположил, что если ваши методы update() задерживаются дольше, так это то, что вы их помещаете какую-либо информацию в какую-то очередь, и запускайте поток, чтобы вытащить следующую задачу из очереди и сделать это. Есть несколько хороших потоковых структур очереди, которые были введены в Java 1.6, которые должны сделать трюк.

0

«Реализация по умолчанию предусмотрено в Observable классе уведомит наблюдателей в том порядке, в котором они зарегистрировали интерес, но подклассы могут изменить этот порядок, использовать не гарантированный заказ, не доставлять уведомления на отдельные потоки, или может гарантировать, что их подкласс следующим этот порядок, как они выбирают ». Ваш подкласс должен указать, какой выбор был сделан.Если он сохраняет значение по умолчанию, применяется анализ @Jacob Tomaw.

В качестве implementation detail «Код, в котором мы извлекаем каждый Наблюдаемый из вектора и храним состояние наблюдателя, нуждается в синхронизации, но уведомление наблюдателей не является (не должно)».

Смежные вопросы