java之Future模式

  • 产生原因
    当某一段程序提交了一个请求,期望得到一个答复。但非常不幸的是,服务程序对这个请求的处理可能很慢。比如,这个请求可能是通过互联网、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());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值