Future设计模式说明
Future 模式有点类似于商品订单。比如在网购时,当看重某一件商品事,就可以提交
订单,当订单处理完成后,在家里等待商品送货上门即可。或者说更形象的我们发送 Ajax
请求的时候,页面是异步的进行后台处理,用户无须一直等待请求的结果,可以继续浏览或
操作其他内容。
代码实现
接口
public interface APi {
String getResult(String queryStr);
}
包装类
public class APiBz implements APi {
private APiReal aPiReal;
private boolean isReady;
@Override
public synchronized String getResult(String queryStr) {
while (!isReady){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return aPiReal.getResult(queryStr);
}
public synchronized void setAPiReal(APiReal aPiReal) {
if (isReady){
return;
}
this.aPiReal = aPiReal;
isReady = true;
notify();
}
}
真实数据
import java.util.concurrent.TimeUnit;
public class APiReal implements APi {
private String resutl;
public APiReal(String queryStr) {
System.out.println("开始根据" + queryStr + "进行耗时查询");
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("查询到结果");
this.resutl = "李四";
}
@Override
public String getResult(String queryStr) {
return this.resutl;
}
}
客户端
public class APiControler {
public APi getRequet(String queryStr){
APiBz bz = new APiBz();
new Thread(() ->{
APiReal aPiReal = new APiReal(queryStr);
bz.setAPiReal(aPiReal);
}).start();
return bz;
}
}
测试类
public class ApiTest {
public static void main(String[] args) {
APiControler controler = new APiControler();
APi lisi = controler.getRequet("lisi");
System.out.println("发送请求成功!");
System.out.println("=================\n开始干其他事情\n===================");
String kk = lisi.getResult("kk");
System.out.println("kk = " + kk);
}
}