package _future;
public class Host {
public Data Request(final int count, final char c)
{
System.out.println(" request(" + count + ", " + c + ") BEGIN");
final FutureData future = new FutureData();
new Thread()
{
public void run()
{
RealData realData = new RealData(count, c);
future.setRealData(realData);
}
}.start();
System.out.println(" request(" + count + ", " + c + ") END");
return future;
}
}
package _future;
public class FutureData implements Data {
private RealData realData = null;
private boolean ready = false;
public synchronized void setRealData(RealData realData)
{
if(ready)
return ;
this.realData = realData;
this.ready = true;
notify();
}
@Override
public synchronized String getContent() {
while(!ready)
{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return realData.getContent();
}
}
package _future;
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 e) {
}
}
System.out.println(" making RealData(" + count + ", " + c + ") END");
this.content = new String(buffer);
}
@Override
public String getContent() {
return content;
}
}