码迷,mamicode.com
首页 > 编程语言 > 详细

线程学习--(九)Future模式

时间:2017-06-14 11:31:04      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:控制   play   code   执行   span   异步   客户端   except   代码   

解释这个概念之前我们先来了解一个场景吧,财务系统的结账功能,这个功能可能是每个月用一次,在这一个月中相关的数据量已经积累得非常大,这一个功能需要调用好几个存储过程来完成。假如要调用5个存储过程,每个存储过程要执行5分钟左右,那么这5个加起来就要25分钟。现在用户要求优化,把结账功能的时间控制在10分钟之内,那么该怎么做呢?解决方案就是将5个存储过程按照业务划分成几个组,这几个组并行执行。其实也就类似ajax的异步请求,主线程可以做其他的事情,耗时的业务让子线程去完成,子线程完成后将数据放在指定的地方,主线程需要的时候再去指定的地方去拿数据。下面代码中FutureData 巧妙地使用了wait和notify方法来保证数据的获取与加载的协调性。

技术分享
package future;

public class Main {
    public static void main(String[] args) {
        FutureClient fc = new FutureClient();
        Data data = fc.request("请求参数");
        System.out.println("请求发送成功!");
        System.out.println("做其他的事情...");
        
        String result = data.getRequest();
        System.out.println(result);
    }
}
View Code
技术分享
package future;

public class FutureClient {

    public Data request(final String queryStr){
        //1 我想要一个代理对象(Data接口的实现类)先返回给发送请求的客户端,告诉他请求已经接收到,可以做其他的事情
        final FutureData futureData = new FutureData();
        //2 启动一个新的线程,去加载真实的数据,传递给这个代理对象
        new Thread(new Runnable() {
            @Override
            public void run() {
                //3 这个新的线程可以去慢慢的加载真实对象,然后传递给代理对象
                RealData realData = new RealData(queryStr);
                futureData.setRealData(realData);
            }
        }).start();
        
        return futureData;
    }
    
}
View Code
技术分享
package future;

public class FutureData implements Data{

    private RealData  realData;
    private boolean isReady = false;
    
    public synchronized void setRealData(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();
    }

}
View Code
技术分享
package future;

public class RealData implements Data {
    
    private String result;
    
    public RealData(String queryStr){
        System.out.println("根据" + queryStr + "进行查询,这是一个很耗时的操作..");
        try {
            Thread.sleep(5000);
        } catch (Exception e) {
            // TODO: handle exception
        }
        System.out.println("操作完毕,获取结果");
        result = "我是查询结果";
    }
    
    @Override
    public String getRequest() {
        
        return result;
    }

}
View Code

 

线程学习--(九)Future模式

标签:控制   play   code   执行   span   异步   客户端   except   代码   

原文地址:http://www.cnblogs.com/code-java/p/6901385.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!