Future 设计模式

Future设计模式说明

Future 模式有点类似于商品订单。比如在网购时,当看重某一件商品事,就可以提交
订单,当订单处理完成后,在家里等待商品送货上门即可。或者说更形象的我们发送 Ajax
请求的时候,页面是异步的进行后台处理,用户无须一直等待请求的结果,可以继续浏览或
操作其他内容。

代码实现

接口

public interface APi {
    String getResult(String queryStr);
}

包装类

public class APiBz implements APi {

    private APiReal aPiReal;
    private boolean isReady;

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

        return aPiReal.getResult(queryStr);
    }

    public synchronized void setAPiReal(APiReal aPiReal) {
        if (isReady){
            return;
        }
        this.aPiReal = aPiReal;
        isReady = true;
        notify();
    }
}

真实数据

import java.util.concurrent.TimeUnit;

public class APiReal implements APi {

    private  String resutl;
    public APiReal(String queryStr) {
        System.out.println("开始根据" + queryStr + "进行耗时查询");
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("查询到结果");
        this.resutl = "李四";
    }

    @Override
    public String getResult(String queryStr) {
        return this.resutl;
    }
}

客户端

public class APiControler {

    public APi getRequet(String queryStr){
        APiBz bz = new APiBz();
        new Thread(() ->{
            APiReal aPiReal = new APiReal(queryStr);
            bz.setAPiReal(aPiReal);
        }).start();
        return bz;
    }
}

测试类

public class ApiTest {
    public static void main(String[] args) {
        APiControler controler = new APiControler();
        APi lisi = controler.getRequet("lisi");
        System.out.println("发送请求成功!");
        System.out.println("=================\n开始干其他事情\n===================");
        String kk = lisi.getResult("kk");
        System.out.println("kk = " + kk);
    }
}
上一篇:7-并发编程-Future&ForkJoin框架原理分析


下一篇:FutureTask 使用指南