Observer类的Java行为多次被通知

时间:2013-06-15 18:47:17

标签: java observer-pattern

我想知道在Observer仍在执行重写方法更新(Observable observable,Object obj)时多次通知Observer时会发生什么。

我有一个具体的Observable类:

public class HttpRequestQueue extends Observable{

//an example queue(for explanation) and other class members
public Queue queue..

public void addToQueue(HttpRequest request){
    queue.add(request);
    setChanged();
    notifyObservers();
}

}

另一个是Observer的课程

public class Webclient implements Observer{

@Override
public void update(Observable observable, Object data) {

while (!observable.queue.isEmpty()){

     //NETWORK OPERATION!!  
     processRequest(queue.remove());
}

}

}

这是主要课程:

public static main(){

HttpRequestQueue qu = new HttpRequestQueue();
Webclient wClient = new WebClient();

qu.addObserver(wClient);

//Now start other application operations
qu.add(new HttpRequest(...)); //Observer's update will be called 1st time
qu.add(new HttpRequest(...)); //Observer's update will be called 2nd time
qu.add(new HttpRequest(...)); //Observer's update will be called 3rd time
}

现在,Observer Webclient的update()的行为将是第二次调用它时,第一次执行将不会结束。

抱歉,如果我听起来像个笨蛋。

1 个答案:

答案 0 :(得分:2)

长时间运行的操作应该在不同的线程中执行。如果我理解正确,processRequest()是一个长时间运行的操作,它将阻止应用程序,直到处理完成。

嗯,应该以与此相似的方式实施:

public void processRequest(final HttpRequest req) {
    new Thread() {
        @Override
        public void run() {
            //processing logic
        }
    }.start();
}

因此,没有什么可以阻止你的申请。

  

我想知道在Observer仍在执行重写方法更新(Observable observable,Object obj)时多次通知Observer时会发生什么。

嗯,在processRequest完成之前,Observer不会收到通知。如果所有内容都是从一个线程执行的,那么此操作processRequest将完成,然后才会执行下一个q.add(new HttpRequest(...));