Future模式
-
核心在于:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑
-
Future模式不会立即返回你需要的数据,但是,他会返回一个契约 ,以后在使用到数据的时候就可以通过这个契约获取到需要的数据。
-
串行程序调用流程
上图串行程序调用的流程,当有一个程序执行比较耗时的时候,其他程序必须等待该耗时操作的结束,这样客户端就必须一直等待返回结果后,才可以执行后续其他的任务 -
Future模式流程图
在Future模式中,虽然获取数据是一个耗时的操作,但是服务程序不会等数据请求完成后就立刻返回客户一个”契约“,于此同时呢,Future会通过另外一个Thread 去构造一个真正的资源,资源准备完毕之后,在给future一个通知。如果客户端急于获取这个真正的资源,那么就会阻塞客户端的其他所有线程,等待资源准备完毕。
Future模式的简单实现
- 主要角色
参与者 | 作用 |
---|---|
Client | 客户端,请求入口 |
Data | 返回数据的接口 |
FutureData | Future数据(契约),虚拟数据,需要装配RealData |
RealData | 真实数据,获取数据比较耗时 |
- 核心结果图
代码实现
- Data 数据返回接口
public interface Data { String getResult(); }
- FutureData 虚拟数据(契约)
public class FutureData implements Data { private RealData realData = null; private boolean isReady = false; private ReentrantLock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); @Override public String getResult() { //数据没有准备好,阻塞等待获取数据 while (!isReady) { try { lock.lock(); condition.await(); } catch