Future模式
什么是future模式
Future模式有点类似于商品订单。比如在网购时,当看重某一件商品事,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可。或者说更形象的我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无须一直等待请求的结果,可以继续浏览或操作其他内容。
核心结构
Main:启动系统,调用Client发出请求;
FutureClient:返回Data对象,理解返回FutureData,并开启ClientThread线程装配RealData;
Data:返回数据的接口;
FutureData:Future数据,构造很快,但是是一个虚拟的数据,需要装配RealData;
RealData:真实数据,构造比较慢。
具体代码实现
main函数:
public class Main {
public static void main(String[] args) throws Exception{
FutureClient futureClient = new FutureClient();
Data data = futureClient.request("请求参数发送");
System.out.println("请求发送成功");
System.out.println("去做其他的事情");
String result = data.getRequest();
System.out.println(result);
}
}
Future客户端:
public class FutureClient{
public Data request(final String str) {
final FutureData futureData = new FutureData();
new Thread(new Runnable() {
@Override
public void run() {
RealData realData = new RealData(str);
futureData.setRequest(realData);
}
}).start();
return futureData;
}
}
Data接口
public interface Data {
String getRequest();
}
FutureData:
实现了一个快速返回的RealData包装。它会快速返回,如果当使用FutrueData的getResult()方法时实际数据没有准备 好,那么程序就会阻塞,等待RrealData准备好数据并注入到FutureData中才最终返回数据。
注意:FutureData是Funture模式的关键,它是真实数据RealData的代理,封装了获取RealData的等待过程。
public class FutureData implements Data {
private RealData realData;
private boolean isReady = false;
public synchronized void setRequest(RealData realData){
if (isReady){
return;
}
this.realData = realData;
isReady = true;
notify();
}
@Override
public synchronized String getRequest() {
while (!isReady){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return this.realData.getRequest();
}
}
RealData是最终需要使用的数据模型,它会进行较为耗时的操作,这里用sleep()函数来模拟这个过程。
public class RealData implements Data {
private String result;
public RealData(String str) {
System.out.println("耗时操作"+str);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
result = "查询完毕";
}
@Override
public String getRequest() {
return result;
}
}