1

我想知道当一个观察者在执行被覆盖的方法更新(Observable observable,Object obj)时被多次通知会发生什么。

我有一个具体的 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();
}

}

另一个类是观察者

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() 的行为将是什么,因为当它第二次被调用时,第一次的执行不会结束。

对不起,如果我听起来像个笨蛋。

4

1 回答 1

2

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

好吧,它应该以与此类似的方式实现:

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

因此,没有任何东西会阻止您的应用程序。

我想知道当一个观察者在执行被覆盖的方法更新(Observable observable,Object obj)时被多次通知会发生什么。

好吧,观察者在完成之前不会收到通知processRequest。如果一切都是从单个线程执行的,则此操作processRequest将完成,然后q.add(new HttpRequest(...));才会执行下一个操作。

于 2013-06-15T18:55:28.300 回答