2010-06-01 5 views
3

를 계속하기 전에 자신의 업데이 트를() 실행 내가 전화 할 때 :java.util.Observable의는 것입니다 클라이언트 전체

java.until.Observable 클래스
setChanged(); 
notifyObservers(); 

, 모든 청취 옵저버() 메소드 자신의 UDPATE의 완전한 실행을 객체 - java.until.Observable 클래스가 계속 실행되기 전에 동일한 스레드에서 실행 중이라고 가정합니다.

메서드를 통해 몇 가지 메시지를 빠른 양보로 보내므로 중요한데, Observer 클래스가 새 메서드보다 먼저 메서드를 완료해야합니다.

우리는 notifyObservers()을 호출 할 때 각 Observer 클래스의 실행 순서가 다를 수 있다는 것을 알고 있습니다. 각 인스턴스에 대한 메소드 실행 순서는 순서대로 중요합니다.

+0

Observable에 의한 옵저버의 실행 순서는 문서에 명시되어 있으며 실제 구현과 정반대입니다. 정말로 Observer/Observable을 사용하고 싶지 않습니다. –

+0

@Tom Hawtin - tackline : 약간의 기본 동작입니다. '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)은 스레드를 생성 할 수 있습니다. 이 경우 시작된 작업이 언제 완료되는지 보증 할 수 없습니다.

이 모두 ObserversObservables를 작성하고 스레드를 산란하지 않는 경우 notifyObservers(Object o) 각 호출은 update(Observable o, Object arg) 마감 마지막 호출 후에 완료됩니다 확신 할 수 있습니다.

0

메쏘드가 등록 된 모든 관찰자에게 통보한다고 가정하면 ... 귀하의 메서드 호출이 동기식이므로 notifyObserver() 메서드가 반환 될 때 메서드 실행이 계속됩니다. notifyObserver()은 모든 옵저버를 반복하여 완료하고 그 결과로 update()- 메서드를 호출하면 반환됩니다.

+0

사실이며 정확합니다. notifyObserver()가 비동기 조작을 시작하지 않는다고 보장하지는 않습니다. – DJClayworth

1

Observable에 대해 비동기 적이거나 스레드 된 것은 없습니다. 나는 당신의 update() 메소드가 오래 걸리면 어떤 종류의 큐에 필요한 정보를 넣고 스레드로부터 다음 태스크를 대기열에서 꺼내서 실행하도록 제안한다. 그 트릭을해야 Java 1.6에서 도입 된 멋진 스레드 안전 큐 구조가 있습니다.

0

"Observable 클래스에서 제공되는 기본 구현은 Observers가 관심있는 것을 등록한 순서대로 Observers에 통지하지만 서브 클래스는이 순서를 변경하거나 보증되지 않은 순서를 사용하거나 별도의 스레드에서 알림을 전달하거나 해당 하위 클래스가 그들이 선택한대로,이 순서. " 하위 클래스는 어떤 선택을했는지 지정해야합니다.기본값을 유지하면 @Jacob Tomaw의 분석이 적용됩니다.

implementation detail "Observable을 Vector에서 추출하고 Observer의 상태를 저장하는 코드는 동기화가 필요하지만 관찰자에게 알리는 것은 아닙니다 (하지 말아야 함)."