Future模式(给你个引用 ,你在通过这个引用去获取数据。给你个钥匙,自己去拿)
其中客户端实际使用时,采用线程等待形式,当other call 执行完成后,唤醒客户端请求。
FutureClient
public class FutureClient { public Data request(final String queryStr){ //1 我想要一个代理对象(Data接口的实现类)先返回给发送请求的客户端,告诉他请求已经接收到,可以做其他的事情 final FutureData futureData = new FutureData(); //2 启动一个新的线程,去加载真实的数据,传递给这个代理对象 new Thread(new Runnable() { @Override public void run() { //3 这个新的线程可以去慢慢的加载真实对象,然后传递给代理对象 RealData realData = new RealData(queryStr); futureData.setRealData(realData); } }).start(); return futureData; } }
包装类代码:
public class FutureData implements Data{ /** * 真实请求的应用 */ private RealData realData ; /** * 标识是否数据准备完成 */ private boolean isReady = false; public synchronized void setRealData(RealData realData) { //如果已经装载完毕了,就直接返回 if(isReady){ return; } //如果没装载,进行装载真实对象 this.realData = realData; isReady = true; //进行通知 notify(); } @Override public synchronized String getRequest() { //如果没装载好 程序就一直处于阻塞状态 while(!isReady){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //装载好直接获取数据即可 return this.realData.getRequest(); } }