Future模式有点类似于商品订单。比如在网购时,当看重某一件商品时,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可。或者说更形象的我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无须一直等待请求的结果,可以继续浏览或操作其他内容。
Future模式的主要角色有:
Main:系统启动,调用FutureClient发出请求
FutureClient:返回Data对象,立即返回FutureData,并开启线程去获取RealData
Data:返回数据的接口
FutureData:虚拟数据类,实现Data接口,需要装载RealData
RealData:真实数据类,实现Data接口(实现方法中返回真实的数据)
示例:
Main类
public class Main {
public static void main(String[] args) {
FutureClient futureClient=new FutureClient();
Data data=futureClient.request("张三");
System.out.println("请求结束!");
System.out.println("执行其他操作!");
String result=data.getRequest();
System.out.println("请求结果:"+result);
}
}
FutureClient类:
public class FutureClient {
public Data request(final String params) {
//1.代理对象(Data接口的实现类)先返回给发送请求的客户端,告诉他请求已经接收到了,可以做其他的事情。
final FutureData futureData=new FutureData();
//2.启动一个新的线程,去加载真是数据,传递给这个代理对象。
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
//3.这个新的线程可以去慢慢的加载真实对象,然后传递给代理对象
RealData realData=new RealData(params);
futureData.setRealData(realData);
}
},"t1");
t1.start();
return futureData;
}
}
Data类:
public interface Data {
String getRequest();
}
FutureData类:
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();
}
@Override
public synchronized String getRequest() {
//如果没有装载好,程序一直处于阻塞状态
if(!isReady) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//装载好直接获取数据
return this.realData.getRequest();
}
}
RealData类:
public class RealData implements Data{
private String result;
public RealData(String params) {
System.out.println("根据参数["+params+"]加载数据!");
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
result="这是根据"+params+"查询的结果!";
}
@Override
public String getRequest() {
return result;
}
}
运行结果:
请求结束!
执行其他操作!
根据参数[张三]加载数据!
请求结果:这是根据张三查询的结果!