定义
Future模式,在程序设计中,当客户端发送一个请求,期望得到回复,但服务程序处理这个请求非常耗时,在传统的单线程环境下,它必须同步等到服务程序返回结果后才能继续执行。而使用Future模式,将调用方式改用异步,使得主调用函数可以使用原先等待返回的时间段处理其他事务。
UML
结构
角色
角色 | 作用 |
---|---|
Main | 系统启动,调用Client发出请求 |
Client | 返回Data对象,立即返回FutureData,并开启Client Thread线程装配RealData |
Data | 返回数据的接口 |
FutureData | Future数据,构造很快,但是是一个虚拟的数据,需要装备RealData |
RealData | 真实数据,构造比较慢 |
代码
public class Main {
public static void main(String[] args) {
Client client = new Client();
Data data = client.request("name");
System.out.println("请求完毕");
try {
//模拟处理其他逻辑
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//使用真实数据
System.out.println("数据=" + data.getResult());
}
}
public class Client {
public Data request(final String queryStr) {
final FutureData futureData = new FutureData();
new Thread(() -> {
RealData realData = new RealData(queryStr);
futureData.setRealData(realData);
}).start();
return futureData;
}
}
public interface Data {
public String getResult();
}
public class FutureData implements Data {
protected RealData realData;
protected boolean isReady = false;
@Override
public synchronized String getResult() {
while (!isReady) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return realData.getResult();
}
public synchronized void setRealData(RealData realData) {
if (isReady) {
return;
}
this.realData = realData;
isReady = true;
notifyAll();
}
}
public class RealData implements Data {
protected String result;
public RealData(String para) {
try {
//模拟等待
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
result = "result";
}
@Override
public String getResult() {
return result;
}
}