应用场景:线程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的方法解析
时间: 2024-12-21 04:59:56