Future模式简介

Future模式

什么是future模式

Future模式有点类似于商品订单。比如在网购时,当看重某一件商品事,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可。或者说更形象的我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无须一直等待请求的结果,可以继续浏览或操作其他内容。

future

核心结构

Main:启动系统,调用Client发出请求;

FutureClient:返回Data对象,理解返回FutureData,并开启ClientThread线程装配RealData;

Data:返回数据的接口;

FutureData:Future数据,构造很快,但是是一个虚拟的数据,需要装配RealData;

RealData:真实数据,构造比较慢。

具体代码实现

main函数:

public class Main {

    public static void main(String[] args) throws Exception{

        FutureClient futureClient = new FutureClient();
        Data data = futureClient.request("请求参数发送");
        System.out.println("请求发送成功");
        System.out.println("去做其他的事情");

        String result = data.getRequest();
        System.out.println(result);
    }
}

Future客户端:

public class FutureClient{

    public Data request(final String str) {
        final FutureData futureData = new FutureData();

        new Thread(new Runnable() {
            @Override
            public void run() {
                RealData realData = new RealData(str);
                futureData.setRequest(realData);
            }
        }).start();

        return futureData;
    }
}

Data接口

public interface Data {

    String getRequest();
}

FutureData:
实现了一个快速返回的RealData包装。它会快速返回,如果当使用FutrueData的getResult()方法时实际数据没有准备 好,那么程序就会阻塞,等待RrealData准备好数据并注入到FutureData中才最终返回数据。

注意:FutureData是Funture模式的关键,它是真实数据RealData的代理,封装了获取RealData的等待过程。

public class FutureData implements Data {
    private RealData realData;
    private boolean isReady = false;

    public synchronized void setRequest(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();
    }
}

RealData是最终需要使用的数据模型,它会进行较为耗时的操作,这里用sleep()函数来模拟这个过程。

public class RealData implements Data {

    private String result;
    public RealData(String str) {
        System.out.println("耗时操作"+str);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        result = "查询完毕";
    }

    @Override
    public String getRequest() {
        return result;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值