【Future模式】

Future模式类似商品订单。比如在网购时,当看中一件商品时,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可。或者类似我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无需一直等待请求的结果,可以继续浏览或操作其他内容。

28_Future模式1-LMLPHP

【Future模式自行代码实现例子】

//返回数据的接口
public interface Data {
String getResult();
} //实现Data接口,返回真实数据,构造比较慢
public class RealData implements Data{ private String result; public RealData(String queryStr) {
System.out.println("查询"+queryStr+",这个查询非常耗时!!!");
try{
Thread.sleep(5000);
}catch (Exception e){
}
System.out.println("查询完毕,获取结果");
this.result = "结果是:哈哈哈哈哈哈哈哈";
} @Override
public String getResult() {
return result;
}
} //实现Data接口,构造很快,返回一个伪数据,需要装配RealData
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 getResult() {
//如果没有装载好,则一直处于阻塞状态
while (!isReady){
try{
wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}
//装载好,直接获取数据即可
return this.realData.getResult();
}
} //立即返回FutureData数据,并开启一个线程去装配RealData数据
public class FutureClient { public Data request(final String queryStr){
//1.想要一个代理对象(Data接口的实现类)先返回发送请求的客户端,告诉他请求已经接收到,可以做其他的事情
final FutureData futureData = new FutureData();
//2.启动一个线程,去加载真实的数据,传递给这个代理对象
new Thread(()-> { //基于java8
//3.这个线程可以慢慢去加载真实对象,然后传递给代理对象
RealData realData = new RealData(queryStr);
futureData.setRealData(realData); //等加载好了,再把数据set到futureData中
}).start();
return futureData;
}
}

public class Main {
public static void main(String[] args) {
FutureClient fc = new FutureClient();
Data data = fc.request("id=666");
System.out.println("请求发送成功");
System.out.println("Main线程开始做别的事情"); String result = data.getResult();
System.out.println("result=="+result);
}
}

【运行结果】

28_Future模式1-LMLPHP

05-24 07:35