多线程设计模式 - Future模式

简介: 一起来看看多线程设计模式中的Future模式吧~

概述


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


1.png

如上图所示,客户端调用购物请求,服务端程序不等数据处理完成便立即返回客户端一个伪造的数据,(相当于订单,而不是真实的商品)这时候由服务端自己偷偷摸摸的发送了一个other call()请求去获取真实的商品(打包,出库,送货)。这就是Future模式的核心所在。


Future模式的主要角色有:


Main:系统启动,调用FutureClient发出请求


FutureClient:返回Data对象,立即返回FutureData,并开启线程去获取RealData


Data:返回数据的接口


FutureData:虚拟数据,返回很快,需要装载RealData


RealData:真实数据


代码实战


根据上面的介绍我们用代码来模拟一下具体的实现过程:


Main:


publicclassMain {    publicstaticvoidmain(String[] args) {        FutureClientfc=newFutureClient();        Datadata=fc.getRequset("jianzh5");        System.out.println("请求完毕...");        Stringresult=data.getRequest();        System.out.println("返回的结果:"+result);    }}

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


FutureClient:


publicclassFutureClient {    publicDatagetRequset(finalStringqueryStr){        //初始化代理对象,先返回给客户端        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:


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


RealData装载数据较慢,这里使用Sleep(5000)模拟复杂业务逻辑。


FutureData:


publicclassFutureDataimplementsData{    privateRealDatarealData;    privatebooleanisReady=false;    publicsynchronizedvoidsetRealData(RealDatarealData){        //如果已经装载完毕则直接返回        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模式,详细内容我们下期再聊!


目录
相关文章
|
2月前
|
负载均衡 算法 安全
基于Reactor模式的高性能网络库之线程池组件设计篇
EventLoopThreadPool 是 Reactor 模式中实现“一个主线程 + 多个工作线程”的关键组件,用于高效管理多个 EventLoop 并在多核 CPU 上分担高并发 I/O 压力。通过封装 Thread 类和 EventLoopThread,实现线程创建、管理和事件循环的调度,形成线程池结构。每个 EventLoopThread 管理一个子线程与对应的 EventLoop(subloop),主线程(base loop)通过负载均衡算法将任务派发至各 subloop,从而提升系统性能与并发处理能力。
117 3
|
3月前
|
机器学习/深度学习 监控 算法
局域网行为监控软件 C# 多线程数据包捕获算法:基于 KMP 模式匹配的内容分析优化方案探索
本文探讨了一种结合KMP算法的多线程数据包捕获与分析方案,用于局域网行为监控。通过C#实现,该系统可高效检测敏感内容、管理URL访问、分析协议及审计日志。实验表明,相较于传统算法,KMP在处理大规模网络流量时效率显著提升。未来可在算法优化、多模式匹配及机器学习等领域进一步研究。
89 0
|
7月前
|
SQL 数据建模 BI
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
|
9月前
|
缓存 安全 Java
【JavaEE】——单例模式引起的多线程安全问题:“饿汉/懒汉”模式,及解决思路和方法(面试高频)
单例模式下,“饿汉模式”,“懒汉模式”,单例模式下引起的线程安全问题,解锁思路和解决方法
|
NoSQL Redis
Lettuce的特性和内部实现问题之在同步调用模式下,业务线程是如何拿到结果数据的
Lettuce的特性和内部实现问题之在同步调用模式下,业务线程是如何拿到结果数据的
135 0
|
NoSQL 关系型数据库 MySQL
简述redis的单线程模式
简述redis的单线程模式
150 0
|
Prometheus 监控 数据可视化
通用快照方案问题之Hystrix进行指标监控如何解决
通用快照方案问题之Hystrix进行指标监控如何解决
110 0
|
设计模式 安全 NoSQL
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
153 0
|
存储 设计模式 监控
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
118 0