Futrue模式就是咱们经常使用到的异步回调模式,异步执行直接返回不含真实数据的结果对象,等获取到真实数据后通过回调返回数据。
package com.healist.coder;
/**
* @Author healist
* @Description
* @Create 2018-03-20 下午5:09
*/
public class FutureLearn {
interface Data{
public String getResult();
}
public static class FutureData implements Data{
private RealData realData;
protected boolean isReady = false;
public synchronized void setRealData(RealData realData) {
while (isReady) {
return;
}
this.realData = realData;
isReady = true;
notifyAll();
}
public synchronized String getResult() {
while (!isReady) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return realData.result;
}
}
static class RealData implements Data {
private final String result;
public RealData(String para) {
// 构造复杂操作等待时间
StringBuffer sb = new StringBuffer();
for(int i=0; i<10; i++) {
sb.append(para);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
result = sb.toString();
}
public String getResult() {
return result;
}
}
static class Client {
public Data request(final String queryStr) {
final FutureData futureData = new FutureData();
new Thread() {
@Override
public void run() {
RealData realData = new RealData(queryStr);
futureData.setRealData(realData);
}
}.start();
return futureData;
}
}
public static void main(String[] args) {
Client client = new Client();
Data data = client.request("name");
System.out.println("请求完毕");
try{
// sleep代替其他业务逻辑操作
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 获取真实数据
System.out.println("数据:" + data.getResult());
}
}
JDK中其实也已经提供了这个模式的接口Future,RunnableFurure接口继承自Future和Runnable接口,RunnableFurure的主要实现类为FutureTask
其使用以及应用场景请看此篇文章FutureTask的用法及两种常用的使用场景