Future模式
Future模式有点类似于商品订单。比如在网购时,当看中某一件商品时,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可。
或者说更形象的我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无需一直等待请求的结果,可以继续浏览或者操作其他内容。
代码实现:
package com.future; public interface Data { String getRequest(); }
package com.future; public class RealData implements Data{ private String result ; public RealData (String queryStr){ System.out.println("根据" + queryStr + "进行查询,这是一个很耗时的操作.."); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("操作完毕,获取结果"); result = "查询结果"; } public String getRequest() { return result; } }
package com.future; 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(); } public synchronized String getRequest() { //如果没装载好,程序就一直处于阻塞状态 if(!isReady){ try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return this.realData.getRequest(); } }
package com.future; public class FutureClient { public Data request(final String queryStr){ // 客户端请求,这时候只需要创建一个包装对象先返回给客户端 final FutureData futureData = new FutureData(); // 启动一个新的线程,去加载真实的数据,传递给这个代理对象 new Thread( new Runnable() { public void run() { //在这个线程里可以慢慢的加载真实对象,然后传递给代理对象 RealData realData = new RealData(queryStr); futureData.setRealData(realData); } } ).start(); //先把new出来的对象返回去 return futureData; } public static void main(String[] args) { FutureClient fc = new FutureClient(); Data data = fc.request("请求参数"); System.out.println("请求发送成功"); System.out.println("做其他的事情..."); String result = data.getRequest(); System.out.println(result); } }