Future模式
Future模式:
什么是Future模式?可以举一个我们开发经常用到的技术,Ajax技术。当用户在页面发送请求后,系统会自动的去后台处理,用户可以不用一直傻傻的在等待结果是什么,可以去继续去操作其他的内容。也可以用我们网购商品来解释,当我们下单后,当平台处理完我们的订单后,接下来就只需要在家等候商品送上门就可以了。
流程见下图:
当客户端Future发送请求的时候,首先它会到服务程序Future那里获取它的包装类,然后就返回给它的客户端Future,此时的包装类中是没有数据的。接着服务程序Future会偷偷的向DataFuture发送请求,然后将其数据封装到之前的包装类中。此时当用户使用到该数据的时候就可以操作了。
其模式的核心图如下:
可以使用下面代码模拟一下这个流程:
public class FutureMain { public static void main(String[] args) { String request="小明";//请求参数 FutureClient futureClient=new FutureClient(); Data date=futureClient.request(request); System.out.println("已经发送请求"); String result= date.getRequest(); System.out.println(result); } }
public interface Data { public String getRequest(); }
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.setRealData(realData); } } ).start(); return futureData; } }
public class FutureData implements Data { private RealData realData; private boolean isRealdate=false; public synchronized void setRealData(RealData realData){ //如果已经加载就直接返回 if(isRealdate){ return; } //还没加载的进行加载 this.realData=realData; isRealdate=true; //进行通知 notify(); } @Override public synchronized String getRequest() { //当没有加载完就让它一直进行阻塞状态 while (!isRealdate){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } return realData.getRequest(); } }
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(); } System.out.println("处理完毕"); result="操作结果就是这个了"; } @Override public String getRequest() { return result; } }