Data
public interface Data {
public abstract String getContent();
}
FutureData
public class FutureData {
private RealData realData = null;
private boolean ready = false;
public synchronized void setRealData(RealData realData){
if (ready){
return;
}
this.realData = realData;
this.ready = ready;
notifyAll();
}
public synchronized String getContent(){
while (!ready){
try {
wait();
}catch (InterruptedException e){
}
}
return realData.getContent();
}
}
Host
public class Host {
public FutureData request(final int count,final char c){
System.out.println(" request (" + count + " , " + c +" ) Begin");
final FutureData futureData = new FutureData();
new Thread(){
public void run(){
RealData realData = new RealData(count,c);
futureData.setRealData(realData);
}
}.start();
System.out.println(" request (" + count + " , " + c +" ) end");
return futureData;
}
}
Main
public class Main {
public static void main(String[] args) {
System.out.println("the main end");
Host host = new Host();
FutureData data1 = host.request(10,'A');
FutureData data2 = host.request(20,'B');
FutureData data3 = host.request(30,'C');
System.out.println("this other begin");
try {
Thread.sleep(2000);
}catch (InterruptedException e){
}
System.out.println("this other end");
System.out.println("data1 + " +data1.getContent());
System.out.println("data2 + " +data2.getContent());
System.out.println("data3 + " +data3.getContent());
System.out.println("the main end");
}
}
RealData
public class RealData implements Data {
private final String content;
public RealData(int count,char c){
System.out.println(" making RealData (" + count + " , " + c + ") begin");
char []buffer = new char[count];
for (int i = 0; i < count; i++) {
buffer[i] = c;
try {
Thread.sleep(100);
}catch (InterruptedException ignored){
}
}
System.out.println(" making RealData (" + count + " , " + c + ") begin");
this.content = new String(buffer);
}
@Override
public String getContent() {
return content;
}
}