gpt4 book ai didi

Observer 类在被多次通知时的 Java 行为

转载 作者:行者123 更新时间:2023-11-30 04:20:46 26 4
gpt4 key购买 nike

我想知道当观察者在执行重写方法 update(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
}

现在观察者 Web 客户端的 update() 的行为是什么,因为当第二次调用它时,第一次的执行不会结束。

抱歉,如果我听起来像个傻子。

最佳答案

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

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

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

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

I wanted to know what happens when an Observer is notified multiple times while it's still executing overridden method update(Observable observable, Object obj).

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

关于Observer 类在被多次通知时的 Java 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17126855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com