java.util.Observable, завершат ли клиенты выполнение своего update () перед продолжением - PullRequest
4 голосов
/ 01 июня 2010

Когда я звоню:

setChanged();
notifyObservers();

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

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

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

Ответы [ 4 ]

4 голосов
/ 02 июня 2010

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).

1 голос
/ 01 июня 2010

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

0 голосов
/ 02 июня 2010

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

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

0 голосов
/ 01 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...