美文网首页工作生活
java-23种设计模式-Future模式

java-23种设计模式-Future模式

作者: 超大大小猿 | 来源:发表于2019-07-02 21:31 被阅读0次

    Future模式是多线程开发中非常常见的一种设计模式。
    它的核心思想是异步调用。当我们需要调用一个函数方法时。如果这个函数执行很慢,那么我们就要进行等待。

    但有时候,我们可能并不急着要结果。因此,我们可以让被调用者立即返回,让他在后台慢慢处理这个请求。对于调用者来说,则可以先处理一些其他任务,在真正需要数据的场合再去尝试获取需要的数据。

    就像我们在网上购物,你买了一个包之后会给你生成一个电子的订单凭证,你只需要持有凭证等待包送过来就行了,这期间你可以做其他你想做的事情。

    对于Future模式来说,它无法立即返回你需要的数据,但是它会返回一个契约,将来你可以凭借这个契约去获取你需要的信息。

    2 Future模式和非Future模式的区别

    在传统的同步方法中调用一些耗时的程序,需要等待一个方法完成后才能进行下一步。而Future模式中客户端调用完成后并不急于去做处理,而去调用其他的业务,这样充分利用了时间,这就是Future模式的核心。

    image.png
    3 Future模式的主要成员

    Main:系统启动,调用client发送请求。
    Client:返回Data对象,立即返回FutureData,并开启ClientThread线程装配RealData。
    Data:返回数据的接口。
    FutureData:Future数据构造快,但是是一个虚拟的数据,需要装配RealData。
    RealData:真实数据。
    4 Future模式的简单实现

    Data接口,这个是客户端希望得到的数据

    public interface Data {
        public String getResult();
    }
    

    RealData是最终需要使用的数据模型,使用sleep()模拟构造过程。

        public final String result;
    
    
        public RealData(String result) {
            System.out.println("RealData start " + System.currentTimeMillis());
            //模拟构造时间长
            StringBuffer sb = new StringBuffer();
            for (int i = 0;i<10;i++){
                sb.append(result);
                try{
                    Thread.sleep(4000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("RealData end " + System.currentTimeMillis());
            this.result = sb.toString();
        }
    
        @Override
        public String getResult() {
            return result;
        }
    }
    
    

    FutureData实现一个快速返回RealData包装
    public class FutureData implements Data {
    public RealData realData = null;
    public boolean isReady = false;

    public synchronized void setRealData(RealData realData){
        if (isReady){
            return;
        }
        this.realData = realData;
        isReady = true;
        this.notifyAll();    //realData已经被注入 通知getResult启动
    }
    
    
    @Override
    public synchronized String getResult() {
        while (!isReady){
            try {
                System.out.println("wait start " + System.currentTimeMillis());
                this.wait();     //等待realData被注入
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("wait end " + System.currentTimeMillis());
        return realData.result;
    }
    

    客户端主要实现获取FutureData,开启构造RealData线程。
    main方法调用发起请求。
    public class Client {

    public  Data request(final String queryStr){
        final FutureData future = new FutureData();
        new Thread(){
            @Override
            public void run(){
                System.out.println("run start " + System.currentTimeMillis());
                RealData realData = new RealData(queryStr);
                System.out.println("run end " + System.currentTimeMillis());
                future.setRealData(realData);
            }
        }.start();
        //立即返回futureData
        return future;
    }
    
    public static void main(String[] args) {
        Client client = new Client();
        //返回的futureData
        Data data = client.request("name");
        System.out.println("请求完成");
        try{
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("main end");
        System.out.println(System.currentTimeMillis());
        System.out.println("真实数据"+data.getResult());
    }
    

    作者本人也是将近十年码农了,码字不易,如果看了有用就点个喜欢个作者,作者会继续跟新一些技术问题哦

    相关文章

      网友评论

        本文标题:java-23种设计模式-Future模式

        本文链接:https://www.haomeiwen.com/subject/pecocctx.html