Future 设计模式就好像我们在发送ajax请求一样,页面是异步的进行后台处理,用户无须一直等待请求的结果,可以继续浏览或操作其他内容。
这个图就很清楚的讲清楚了这个模式,当客户端发送数据过去,服务端会进行处理,但是为了保证用户体验,用户可以进行其他操作,当用户需要该数据的时候,进行请求即可,这种模式适用于有很多数据需要处理的时候,可以让后台去处理,我们可以进行自己想要的操作。 完整代码如下:
请求的数据对象接口:
public interface Data { String getRequest();// 获取请求之后数据的方法 }客户端:
/** * 客户端 */ public class FutureClient { // 请求 public Data request(String queryStr) { // 1. 将包装类先返回给发送请求的客户端,告诉他请求已经接收到,可以去做其他事情了。 final FutureData futureData = new FutureData(); // 2. 启动一个新的线程,去加载真实的数据,传递给这个包装类 new Thread(() -> { RealData realData = new RealData(queryStr); futureData.setRealData(realData); }).start(); // 3. 快速返回包装类 return 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; this.isReady = true; // 进行通知 notify(); } @Override public synchronized String getRequest() { // 获取数据,判断是否装载好了真实数据类,如果没装载好,程序就一直处于阻塞状态 while (!isReady) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 装载好的真实对象的数据进行返回 return this.realData.getRequest(); } }真实的数据类对象:
/** * 真实数据类 */ public class RealData implements Data { private String result; // 通过构造器实现具体真实数据查询业务 public RealData(String queryStr) { System.out.println("根据" + queryStr + "进行查询,这是一个很耗时的操作..."); try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("操作完毕,获取结果。"); this.result = "张三"; } @Override public String getRequest() { return result; } } 测试: public class Main { public static void main(String[] args) { // 初始化客户端 FutureClient futureClient = new FutureClient(); // 发起请求,请求参数 zhangsan Data data = futureClient.request("zhangsan"); System.out.println("请求发送成功!"); // 如果不使用 Future 模式,则阻塞等待,请求正常结束或者请求失败返回错误信息。 // 使用了 Future 模式以后,可以去做其他事情提高性能 System.out.println("做其他事情..."); // 等我们业务需要使用请求返回结果的时候,获取请求数据即可。 String result = data.getRequest(); System.out.println("result = " + result); } }结果: