资讯专栏INFORMATION COLUMN

多线程设计模式 - Future模式

edgardeng / 670人阅读

摘要:模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用。这类似我们日常生活中的在线购物流程,带在购物网看着一件商品时可以提交表单,当订单完成后就可以在家里等待商品送货上门。内部类已经实现了模式,后续再讲

Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用。这类似我们日常生活中的在线购物流程,带在购物网看着一件商品时可以提交表单,当订单完成后就可以在家里等待商品送货上门。或者说更形象的是我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无需等待请求的结果,可以继续浏览或操作其他内容。

如上图所示,客户端调用购物请求,服务端程序不等数据处理完成便立即返回客户端一个伪造的数据,(相当于订单,而不是真实的商品)这时候由服务端自己偷偷摸摸的发送了一个other call()请求去获取真实的商品(打包,出库,送货)。这就是Future模式的核心所在。
Future模式的主要角色有:
Main:系统启动,调用FutureClient发出请求
FutureClient:返回Data对象,立即返回FutureData,并开启线程去获取RealData
Data:返回数据的接口
FutureData:虚拟数据,返回很快,需要装载RealData
RealData:真实数据
我们来看代码:
Main:

public class Main {
    public static void main(String[] args) {
        FutureClient fc = new FutureClient();
        Data data = fc.getRequset("jianzh5");
        System.out.println("请求完毕...");
        String result = data.getRequest();
        System.out.println("返回的结果:"+result);
    }
}

此类主要调用FutureClient的getRequset方法去返回数据
FutureClient:

public class FutureClient {
    public Data getRequset(final String queryStr){
        //初始化代理对象,先返回给客户端
        final FutureData futureData = new FutureData();
        //启动一个新的线程去加载真实的数据,传递给这个代理对象
        new Thread(new Runnable() {
            @Override public void run() {
                //此线程去加载真实对象,然后传递给代理对象
                RealData realData = new RealData(queryStr);
                futureData.setRealData(realData);
            }
        }).start();
        System.out.println("代理对象返回:"+futureData);
        return futureData;
    }
}

该类在接受到用户请求后很快就能返回虚拟数据 futureData,本身启动一个线程去获取真实数据
RealData:

public class RealData implements Data{
    private String result;

    public RealData(String queryStr){
        System.out.println("根据参数: "+queryStr+" 进行查询,这是一个很耗时的操作!");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("装载完毕,获取结果");
        result = "查询结果";
    }

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

RealData装载数据较慢,这里使用Sleep(5000)模拟复杂业务逻辑。
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;
        isReady = true;
        //通知
        notify();
    }

    @Override public synchronized String getRequest() {
        //如果未装载好一直处于阻塞状态
        while (!isReady){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //装载好直接返回数据即可
        return this.realData.getRequest();
    }
}

该类是Future模式的关键,它实际是真实数据RealData的代理,封装了获取RealData的等待过程实际返回的是真实的数据。
JDK内部类已经实现了Future模式,后续再讲!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69145.html

相关文章

  • Java线程进阶(四二)—— J.U.C之executors框架:Future模式

    摘要:本文首发于一世流云的专栏一模式简介模式是多线程设计模式中的一种常见模式,它的主要作用就是异步地执行任务,并在需要的时候获取结果。二中的模式在多线程基础之模式中,我们曾经给出过模式的通用类关系图。 showImg(https://segmentfault.com/img/bVbiwcx?w=1000&h=667); 本文首发于一世流云的专栏:https://segmentfault.co...

    marek 评论0 收藏0
  • Java线程基础(十一)——Future模式

    摘要:一定义模式用来获取线程的执行结果。案例中的类就是参与者参与者接受请求,然后创建线程进行异步处理。参与者会立即返回以的形式。虚拟数据参与者是用来统一代表参与者与参与者。 一、定义 Future模式用来获取线程的执行结果。在Thread-Per-Message模式中,如果调用一个线程异步执行任务,没有办法获取到返回值,就像:host.request(10,A);而Future模式送出请求后...

    tinyq 评论0 收藏0
  • 谈谈Python协程技术的演进

    摘要:事件循环是异步编程的底层基石。对事件集合进行轮询,调用回调函数等一轮事件循环结束,循环往复。协程直接利用代码的执行位置来表示状态,而回调则是维护了一堆数据结构来处理状态。时代的协程技术主要是,另一个比较小众。 Coding Crush Python开发工程师 主要负责岂安科技业务风险情报系统redq。 引言 1.1. 存储器山 存储器山是 Randal Bryant 在《深入...

    zhiwei 评论0 收藏0
  • 并发编程高级篇一----JDK任务执行框架,Concurrent.util工具类以及锁的高级深化

    摘要:的多任务执行框架提供了一套线程框架来帮助开发者有效的进行线程控制,扮演线程工厂的角色,其创建线程的方法如下返回固定数量的线程池,该方法的线程数始终不变。 1.Jdk的多任务执行框架 JDK提供了一套线程框架Executor来帮助开发者有效的进行线程控制,Executors扮演线程工厂的角色,其创建线程的方法如下 newFixedThreadPool() 返回固定数量的线程池,该方法的...

    Shonim 评论0 收藏0
  • 从JDK11新增HttpClient谈谈非阻塞模型

    摘要:是一个倡议,它提倡提供一种带有非阻塞背压的异步流处理的标准。是标准的实现之一。的实现细节请求响应的与请求响应的暴露为是请求的的消费者是响应的的生产者内部的内部 北京时间 9 月 26 日,Oracle 官方宣布 Java 11 正式发布 一、JDK HTTP Client介绍 JDK11中的17个新特性 showImg(https://segmentfault.com/img/remo...

    pingan8787 评论0 收藏0

发表评论

0条评论

edgardeng

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<