您的位置:首页 > 编程语言 > Java开发

java之Future模式

2018-03-24 22:50 197 查看
产生原因

当某一段程序提交了一个请求,期望得到一个答复。但非常不幸的是,服务程序对这个请求的处理可能很慢。比如,这个请求可能是通过互联网、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());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Future模式