I have an app that needs to wait for some unknown amount of time. It must wait until several data fields are finished being populated by a server.
The server’s API provides me a way to request data, easy enough…
The server’s API also provides a way to receive my data back, one field at a time. It does not tell me when all of the fields are finished being populated.
What is the most efficient way to wait until my request is finished being processed by the server? Here’s some pseudocode:
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();
}
}
I have to wait until the server is finished populating my data fields, and the server doesn’t let me know when the request is complete. So I must keep checking whether or not my request has finished processing. What is the most efficient way to do this?
wait() and notify(), with a method guarding the while loop that checks if I have all of the required values yet every time I’m woken up by notify()?
Observer and Observable, with a method that checks if I have the all the required values yet every time my Observer.Update() is called?
What’s the best approach? Thanks.
If I understood you right, some other thread calls
receiveDataon yourMyAppto fill the data. If that’s right, then here’s how you do it:You sleep like this:
receiveData should make a
notifycall, tounpausethatwaitcall of yours. For example like this:Both blocks will need to be “synchronized” on
thisobject to be able to aquire it’s monitor (that’s needed forwait). You need to either declare the methods as “synchronized”, or put the respective blocks insidesynchronized(this) {...}block.