Future模式有点类似于商品订单。比如在网购时,当看重某一件商品事,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可。或者说更形象的我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无须一直等待请求的结果,可以继续浏览或操作其他内容。
代码实现:
public interface Data {
String getRequest();
}
public class RealData implements Data {
private String result;
public RealData(String result) {
System.out.println("根据" + result + "查询数据,这是一个耗时的过程。。。");
try {
System.out.println("这里查询需要耗时5秒");
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("查询完成");
this.result = "查询结果";
}
@Override
public String getRequest() {
return result;
}
}
public class FutureData implements Data {
private RealData realData = null;
@Override
public synchronized String getRequest() {
if(this.realData == null) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return realData.getRequest();
}
public synchronized void setRequest(RealData realData) {
if(this.realData != null) {
return;
}
this.realData = realData;
//唤醒阻塞的其他调用getRequest的线程
notify();
}
}
public class FutureClient {
public Data getRequest(final String string) {
final FutureData data = new FutureData();
new Thread(new Runnable() {
@Override
public void run() {
RealData realData = new RealData("请求参数");
data.setRequest(realData);
}
}).start();
return data;
}
}
public class Main {
public static void main(String[] args) {
FutureClient futureClient = new FutureClient();
Data data = futureClient.getRequest("请求参数");
System.out.println("做其他事。。。。");
String result = data.getRequest();
System.out.println(result);
}
}