并行-Future模式

本文介绍了Future模式的核心思想,即通过异步处理减少等待时间,并详细展示了其实现方式,包括使用FutureSubject来替代耗时创建的RealSubject,从而允许客户端在等待期间执行其他任务。

一、Future模式的核心:

       去除主函数的等待时间,并让原本需要等待的时间段用于处理其他的业务逻辑。

       对于多线程,如果线程A要等待线程B的结果,那么线程A没必要等待B,直到B有结果,可以先拿到一个未来的Future,等B有结果是再去取真实的结果。

        

          

        首先客户端向服务器请求RealSubject,但这个资源的创建非常耗时,这时返回Client端一个FutureSubject满足客户端的请求,同时,Future会通过创建一个Thread去真正的获取资源,资源准备完毕后,再给Future一个通知。但是如果客户端必须马上获取这个真正的资源,那么就会阻塞客户端的其他所有线程,等待资源准备完毕。


二、Future模式的实现

   Data接口:返回数据的接口

public interface Data {
    public String getResult();
}

   RealSubject:真实的数据,其构造时比较慢的

  

public class RealSubject implements Data {
    protected final String result;

    public RealSubject(String para) {
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < 10; i++){
            sb.append(para);
            try {
                //用线程去模拟真实数据的构造
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        result = sb.toString();
    }

    @Override
    public String getResult() {
        return result;
    }
}

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

public class FutureData implements Data {
    protected RealSubject realData = null;
    protected boolean isReady = false;

    public synchronized void setRealData(RealSubject realData){
        if(isReady){
            return ;
        }
        this.realData = realData;
        isReady = true;
        notifyAll();
    }

    @Override
    public String getResult() {
        while (!isReady){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return realData.result;
    }

   Thread:启动线程,去获取数据

public class ClientThread {
    public Data request(final String queryStr){
        final FutureData futureData = new FutureData();
        new Thread(){
            public void run(){
                RealSubject realData = new RealSubject(queryStr);
                futureData.setRealData(realData);
            }
        }.start();
        return futureData;
    }
}


  Client:返回Data对象,立即返回FutureData,并开启ClientThread装配RealSubject

  

public class Client {
    public static void main(String[] args){
        ClientThread clientThread = new ClientThread();

        Data data = clientThread.request("name");
        System.out.println("request over");

        try {
            Thread.sleep(100000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("data = " + data.getResult());
    }
}


三、总结:

       Future模式核心就是去除等待时间。我们可以这么理解,Future模式本身可看做是一个显示引用和一个异步处理结果的引用。由于其异步性,未返回真实数据时,此时对象不可用,我们可以利用这段时间去处理其他业务,或进入其他分支,直到返回真实数据,再进行处理。


评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值