gpt4 book ai didi

java - 在 Java 中等待的最佳方式

转载 作者:搜寻专家 更新时间:2023-11-01 01:55:54 25 4
gpt4 key购买 nike

我有一个应用程序需要等待一段未知的时间。它必须等到服务器完成填充多个数据字段。

服务器的 API 为我提供了一种请求数据的方法,非常简单...

服务器的 API 还提供了一种方法来接收我的数据,一次接收一个字段。它不会告诉我所有字段何时完成填充。

等待服务器处理完我的请求的最有效方法是什么?这是一些伪代码:

public class ServerRequestMethods {
public void requestData();
}

public interface ServerDeliveryMethods {
public void receiveData(String field, int value);
}

public class MyApp extends ServerRequestMethods implements ServerDeliveryMethods {
//store data fields and their respective values
public Hashtable<String, Integer> myData;

//implement required ServerDeliveryMethods
public void receiveData(String field, int value) {
myData.put(field, value);
}

public static void main(String[] args) {
this.requestData();

// Now I have to wait for all of the fields to be populated,
// so that I can decide what to do next.

decideWhatToDoNext();
doIt();
}
}

我必须等到服务器完成填充我的数据字段,并且服务器不会在请求完成时通知我。所以我必须不断检查我的请求是否已完成处理。最有效的方法是什么?

wait() 和 notify(),使用一个方法来保护 while 循环,每次我被 notify() 唤醒时检查我是否拥有所有需要的值?

Observer 和 Observable,每次调用 Observer.Update() 时都有一种方法检查我是否拥有所有必需的值?

什么是最好的方法?谢谢。

最佳答案

如果我没理解错的话,其他一些线程 会调用您的MyApp 上的receiveData 来填充数据。如果这是正确的,那么您可以这样做:

  1. 你是这样睡的:

    do {
    this.wait(someSmallTime); //We are aquiring a monitor on "this" object, so it would require a notification. You should put some time (like 100msec maybe) to prevent very rare but still possible deadlock, when notification came before this.wait was called.
    } while (!allFieldsAreFilled());
  2. receiveData 应该进行一个notify 调用,以unpause 您的wait 调用。例如像这样:

    myData.put(field, value);   
    this.notify();
  3. 这两个 block 都需要在 this 对象上“同步”,以便能够获取它的监视器(wait 需要)。您需要将这些方法声明为“同步”,或者将相应的 block 放在 synchronized(this) {...} block 中。

关于java - 在 Java 中等待的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9411950/

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