- 产生原因
当某一段程序提交了一个请求,期望得到一个答复。但非常不幸的是,服务程序对这个请求的处理可能很慢。比如,这个请求可能是通过互联网、HTTP或者Web Service等并不太高效的方式调用的。在传统的单线程环境下,调用函数是同步的,也就是说它必须等到服务程序返回结果后,才能进行其他处理。 - 解决方式
请求本身仍然需要很长一段时间来处理。但是,服务程序不等数据处理完成便立即返回客户端一个伪造的数据,客户端在拿到这个返回结果后,并不急于对其进行处理,而是去调用其他业务逻辑,充分利用等待时间。在完成了其他业务逻辑的处理后,最后再使用返回比较慢的future数据。这样,在整个调用过程中,就不存在无谓的等待,充分利用了所有的时间片段,从而提高系统的响应速度。 - 代码逻辑。
对于客户端的每个请求,返回一个伪造的结果,然后把这个伪造的结果放入一个新的线程中,然后在新线程里处理业务的具体逻辑,处理完后把真实的结果放入伪造的结果中。客户端会检测是否是真实的结果,如果不是则等待,如果是,则返回结果。 - 代码实现:
Main 系统启动,电泳client发出请求
Client 返回Data对象,立即返回FutureData,并开启ClientThread线程装配RealData.
Data 返回数据的接口
FutureData Future数据,构造很快,但是是一个虚拟的数据,需要装配RealData.
RealData 真实数据,其构造是比较慢的。
public interface Data {
String getResult();
}
public class RealData implements Data{
protected final String result;
public RealData(String para){
StringBuilder sb=new StringBuilder();
for(int i=0;i<10;i++){
sb.append(para);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
result=sb.toString();
}
@Override
public String getResult() {
return null;
}
}
public class FutureData implements Data{
protected RealData realData=null;
protected boolean isReady=false;
public synchronized void setRealData(RealData realData){
if(isReady){
return;
}
this.realData=realData;
isReady=true;
notifyAll();
}
@Override
public synchronized String getResult() {
while (!isReady){
try{
wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}
return realData.result;
}
}
public class Client {
public Data request(final String queryStr){
final FutureData future=new FutureData();
new Thread(()->{
RealData realData=new RealData(queryStr);
future.setRealData(realData);
}).start();
return future;
}
}
public class Main {
public static void main(String[] args) {
Client client=new Client();
Data data=client.request("name");
System.out.println("请求完毕");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("数据 = "+data.getResult());
}
}