多线程设计模式--Future模式

什么是Future模式?
Future模式有点类似于我们网购。大家都知道,当我们下好订单完成支付时,商品不会立刻送到我们的手中,因为卖家需要根据订单从仓库取货,然后选择物流发货,经过一段时间后才能送到我们手上。而在这一段时间内,我们完全不需要在家苦苦等候,可以处理其它事务。
那么联想到我们程序设计上。当一段程序提交了一个请求,并希望获得一个答复。但是服务端对这个请求处理是非常慢的(例如Htpp或者Web Service等不太高效的请求),在单线程的情况下,调用函数是同步的,也就是说它必须等到服务程序返回结果后,才能进行其他处理。而在Future模式中,调用模式使用异步,原先主程序中用于等待结果的时间段,可以用于处理其它的事务。
代码实现
下面我们用个简单的实例来实现一下Future模式
首先我们来明确一下Future的参与者
Main ,主程序,系统主线程,调用Client发出请求
Client ,返回Data对象,请求发出立马返回FutureData,开启另外一个线程来装配RealData。
Data ,返回数据接口
FutureData, Data的实现类,Future数据,构造快,但是数据是虚拟的,需要装配RealData
RealData ,真实数据,构造比较缓慢。
代码
Main

    public static void main(String[] args) {
        Client client = new Client();
        Data data = client.request("name");//先返回FutureData,即时返回
        System.out.println("请求完毕");
        try{
            Thread.sleep(20);//其他逻辑操作
            System.out.println("沉睡完毕");
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("数据="+data.getResult());//真数据的返回
    }

Client

    public Data request(final String queryStr){
        final FutureData future = new FutureData();
        new Thread(){//开启另一线程来装配RealData
            public void run(){
                RealData realdata = new RealData(queryStr);
                future.setRealData(realdata);
            }
        }.start();
        return future;
    }

Data

public interface Data{
    public String getResult();
}

FutureData

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();//唤醒getResult
    }
    @Override
    public synchronized String getResult() {
        while(!isready){
            try{
                wait();//等待RealData被注入
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
        return realdata.result;
    }
}

RealData

public class RealData implements Data {
    protected final String result;
    public RealData(String para){//模拟真实数据的构造,比较耗时
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<10;i++){
            sb.append(para);
            try{
                Thread.sleep(100);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
        this.result=sb.toString();
    }
    public String getResult(){
        return this.result;
    }
}

以上那就是简单一个Future模式的简单示例。
ps:上述篇章内容来自一本书,但是时间过长,我给忘记书名了,那本书让我受益匪浅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值