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);
}
}
结果: