什么是Future模式?
Future模式有点类似于我们网购。大家都知道,当我们下好订单完成支付时,商品不会立刻送到我们的手中,因为卖家需要根据订单从仓库取货,然后选择物流发货,经过一段时间后才能送到我们手上。而在这一段时间内,我们完全不需要在家苦苦等候,可以处理其它事务。
那么联想到我们程序设计上。当一段程序提交了一个请求,并希望获得一个答复。但是服务端对这个请求处理是非常慢的(例如Htpp或者Web Service等不太高效的请求),在单线程的情况下,调用函数是同步的,也就是说它必须等到服务程序返回结果后,才能进行其他处理。而在Future模式中,调用模式使用异步,原先主程序中用于等待结果的时间段,可以用于处理其它的事务。
代码实现
下面我们用个简单的实例来实现一下Future模式
首先我们来明确一下Future的参与者
Main ,主程序,系统主线程,调用Client发出请求
Client ,返回Data对象,请求发出立马返回FutureData,开启另外一个线程来装配RealData。
Data ,返回数据接口
FutureData, Data的实现类,Future数据,构造快,但是数据是虚拟的,需要装配RealData
RealData ,真实数据,构造比较缓慢。
代码
Main
public static void main(String[] args) {
Client client = new Client();
Data data = client.request("name");//先返回FutureData,即时返回
System.out.println("请求完毕");
try{
Thread.sleep(20);//其他逻辑操作
System.out.println("沉睡完毕");
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("数据="+data.getResult());//真数据的返回
}
Client
public Data request(final String queryStr){
final FutureData future = new FutureData();
new Thread(){//开启另一线程来装配RealData
public void run(){
RealData realdata = new RealData(queryStr);
future.setRealData(realdata);
}
}.start();
return future;
}
Data
public interface Data{
public String getResult();
}
FutureData
public class FutureData implements Data {
protected RealData realdata = null;
protected boolean isready = false;
public synchronized void setRealData(RealData realdata){
if(isready){//真实数据装配完成,退出
return;
}
this.realdata = realdata;
isready= true ;
notifyAll();//唤醒getResult
}
@Override
public synchronized String getResult() {
while(!isready){
try{
wait();//等待RealData被注入
}catch(InterruptedException e){
e.printStackTrace();
}
}
return realdata.result;
}
}
RealData
public class RealData implements Data {
protected final String result;
public RealData(String para){//模拟真实数据的构造,比较耗时
StringBuffer sb = new StringBuffer();
for(int i=0;i<10;i++){
sb.append(para);
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
}
this.result=sb.toString();
}
public String getResult(){
return this.result;
}
}
以上那就是简单一个Future模式的简单示例。
ps:上述篇章内容来自一本书,但是时间过长,我给忘记书名了,那本书让我受益匪浅。