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

来源:互联网 发布:淘宝客代购是什么意思 编辑:程序博客网 时间:2024/05/21 09:52

什么是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:上述篇章内容来自一本书,但是时间过长,我给忘记书名了,那本书让我受益匪浅。

0 0
原创粉丝点击