package demo4;
public interface Data {
String getRequest();
}
package demo4;
public class RealData implements Data {
private String result;
public RealData(String queryStr){
System.out.println("根据" + queryStr + "进行查询,这是一个很耗时的操作");
try{
Thread.sleep(5000);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("操作完毕,获得结果");
result = "查询结果";
}
@Override
public String getRequest() {
return result;
}
}
package demo4;
public class FutureData implements Data {
private RealData realData;
private boolean isReady = false;
public synchronized void setRealData(RealData realData) {
// 如果已经装载完成了,就直接返回
if (isReady) {
return;
}
// 如果没有装载完,进行装载真实对象
this.realData = realData;
isReady = true;
notify();
}
public synchronized String getRequest() {
// 如果没有装载好,程序就一直处理阻塞状态
while (!isReady) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 装载好直接读取数据即可
return this.realData.getRequest();
}
}
package demo4;
public class Main {
public static void main(String[] args) {
FutureClient fc = new FutureClient();
Data data = fc.request("请求参数");
System.out.println("请求发送成功!");
System.out.println("做其他的事情...");
String result = data.getRequest();
System.out.println(result);
}
}
package demo4;
public class FutureClient {
public Data request(final String queryStr) {
// 1、我想要一个代理对象(Data接口的实现类)先返回给发送请求的客户端,告诉他请求已经收到,可以做其他的事情
final FutureData futureData = new FutureData();
// 2、启动一个新的线程,去加载真实的数据,传递给这个代理对象
new Thread(new Runnable() {
@Override
public void run() {
// 3、这个新的线程可以去慢慢地加载这个真实对象,然后传递给代理对象
RealData realData = new RealData(queryStr);
futureData.setRealData(realData);
}
}).start();
return futureData;
}
}