应用场景:线程A需要线程B的执行结果,但没必要一直等待线程B执行完,这个时候可以先拿到未来的Future对象,等线程B执行完再来取真实结果。
定义RealData真实数据类,其构造函数很慢,是用户最后需要使用的数据,
static class RealData<T> {
protected T result;
public RealData(T result) {
this.result = result;
}
public T getResult() {
return result;
}
}
定义Future对象任务类,其是Future模式的关键,是真实数据RealData的代理,封装了获取RealData的等待过程。
public class FutureData<T> {
private static final UtilsLog lg = UtilsLog.getLogger(FutureData.class);
protected boolean isReady = false;
private RealData<T> realData = null;
private Object mutix = new Object();
public static FutureData request(final String request) {
lg.e("新建FutureData对象");
final FutureData future = new FutureData();
new Thread(new Runnable() {
@Override
public void run() {
UtilsThread.sleepIgnoreInteruptedException(5000);
lg.e("*************模拟耗时线程with time :5000******");
RealData realData = new RealData(request);
future.setRealData(realData);
}
}).start();
lg.e("返回新建的FutureData对象");
return future;
}
public T getResult() {
synchronized (mutix) {
while (!isReady) {
lg.e("getResult:before wait");
try {
mutix.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
lg.e("getResult:after wait");
}
lg.e("getResult:" + realData.getResult().toString());
return realData.getResult();
}
}
public void setRealData(RealData<T> realData) {
lg.e("执行设置数据:setRealData");
if (this.isReady) {
return;
}
this.realData = realData;
this.isReady = true;
synchronized (mutix) {
mutix.notify();
}
}
}
在业务层发起请求,并调用getResult方法等待返回任务执行结果。
FutureData futureData = FutureData.request("我要执行耗时任务");
lg.e("bootUpTestFunction result:" + futureData.getResult());
运行结果如下所示,分析知getResult方法中若isReady=false则调用wait()锁定当前线程,直至setRealData中调用notify()后继续执行wait后的方法。
关于Object的wait以及notify的相关知识点,请查看Java之Object的wait与notify的方法解析