future模式概念
客户端发送一个长时间的请求,服务端不需等待该数据处理完成便立即返回一个伪造的代理数据(相当于商品订单,不是商品本身),用户也无需等待,先去执行其他的若干操作后,再去调用服务器已经完成组装的真实数据。该模型充分利用了等待的时间片段。
传统的获取数据的方式
使用future模式的数据获取方式
代码结构
类图
代码
package test;
public class RealData implements Data {
protected String result ;
public RealData(String param) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++) {
sb.append(param);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
result = sb.toString();
}
@Override
public String getResult() {
return result;
}
}
package test;
public class Client {
public Data request(final String queryStr) {
final FutureData future = new FutureData();
new Thread(){
public void run(){
RealData realData = new RealData(queryStr);
future.setRealData(realData);
}
}.start();
//一开始直接返回future,将耗时的初始化操作放到线程中执行
return future;
}
}
package test;
public interface Data {
public String getResult();
}
package test;
public class FutureData implements Data {
private RealData realData = null;
private boolean isReady = false;
public synchronized void setRealData(RealData realData) {
System.out.println("进入FutureData的setRealData()");
while (isReady) {
return;
}
this.realData = realData;
isReady = true;
notifyAll();
System.out.println("执行了notifyAll()");
}
@Override
public synchronized String getResult() {
System.out.println("进入FutureData的getResult()");
while (!isReady) {
try {
System.out.println("执行了wait()");
wait();
System.out.println("唤配了wait()");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//真实数据构造完成后,再获取真实数据的结果
return realData.result;
}
}
package test;
public class FutureTest {
public static void main(String[] args) {
Client client = new Client();
Data data = client.request("param");
//一段长时间的业务逻辑,可以处理其他事情
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("real Data:"+data.getResult());
}
}
运行FutureTest ,输出:
进入FutureData的getResult()
执行了wait()
进入FutureData的setRealData()
执行了notifyAll()
唤配了wait()
real Data:paramparamparamparamparamparamparamparamparamparam