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

Future 设计模式就好像我们在发送ajax请求一样,页面是异步的进行后台处理,用户无须一直等待请求的结果,可以继续浏览或操作其他内容。

wjf
这个图就很清楚的讲清楚了这个模式,当客户端发送数据过去,服务端会进行处理,但是为了保证用户体验,用户可以进行其他操作,当用户需要该数据的时候,进行请求即可,这种模式适用于有很多数据需要处理的时候,可以让后台去处理,我们可以进行自己想要的操作。
完整代码如下:

请求的数据对象接口:

public interface Data {

    String getRequest();// 获取请求之后数据的方法

}

客户端:


/**
 * 客户端
 */
public class FutureClient {

    // 请求
    public Data request(String queryStr) {
        // 1. 将包装类先返回给发送请求的客户端,告诉他请求已经接收到,可以去做其他事情了。
        final FutureData futureData = new FutureData();
        // 2. 启动一个新的线程,去加载真实的数据,传递给这个包装类
        new Thread(() -> {
            RealData realData = new RealData(queryStr);
            futureData.setRealData(realData);
        }).start();
        // 3. 快速返回包装类
        return futureData;
    }

}

数据包装类:


/**
 * 数据包装类
 */
public class FutureData implements Data {

    private RealData realData;
    private boolean isReady = false;// 数据是否装载完毕的标记

    public synchronized void setRealData(RealData realData) {
        // 如果已经装载完毕,就直接返回
        if (isReady)
            return;
        // 如果没装载,进行装载真实对象操作
        this.realData = realData;
        this.isReady = true;
        // 进行通知
        notify();
    }

    @Override
    public synchronized String getRequest() {
        // 获取数据,判断是否装载好了真实数据类,如果没装载好,程序就一直处于阻塞状态
        while (!isReady) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 装载好的真实对象的数据进行返回
        return this.realData.getRequest();
    }

}

真实的数据类对象:

/**
 * 真实数据类
 */
public class RealData implements Data {

    private String result;

    // 通过构造器实现具体真实数据查询业务
    public RealData(String queryStr) {
        System.out.println("根据" + queryStr + "进行查询,这是一个很耗时的操作...");
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("操作完毕,获取结果。");
        this.result = "张三";
    }

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

}
测试:
public class Main {

    public static void main(String[] args) {
        // 初始化客户端
        FutureClient futureClient = new FutureClient();
        // 发起请求,请求参数 zhangsan
        Data data = futureClient.request("zhangsan");
        System.out.println("请求发送成功!");

        // 如果不使用 Future 模式,则阻塞等待,请求正常结束或者请求失败返回错误信息。

        // 使用了 Future 模式以后,可以去做其他事情提高性能
        System.out.println("做其他事情...");

        // 等我们业务需要使用请求返回结果的时候,获取请求数据即可。
        String result = data.getRequest();
        System.out.println("result = " + result);
    }

}

结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值