多线程设计模式 - 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模式,详细内容我们下期再聊!


目录
相关文章
|
1月前
|
存储 Java
高并发编程之多线程锁和Callable&Future 接口
高并发编程之多线程锁和Callable&Future 接口
43 1
|
1月前
|
存储 缓存 Java
9.队列:生产消费模式及线程池的运用
9.队列:生产消费模式及线程池的运用
42 0
|
1月前
|
数据处理
多线程与并发编程【线程对象锁、死锁及解决方案、线程并发协作、生产者与消费者模式】(四)-全面详解(学习总结---从入门到深化)
多线程与并发编程【线程对象锁、死锁及解决方案、线程并发协作、生产者与消费者模式】(四)-全面详解(学习总结---从入门到深化)
48 1
|
26天前
|
缓存 NoSQL 中间件
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?epoll、poll和select + Reactor模式
【5月更文挑战第19天】`epoll`、`poll`和`select`是Linux下多路复用IO的三种方式。`select`需要主动调用检查文件描述符,而`epoll`能实现回调,即使不调用`epoll_wait`也能处理就绪事件。`poll`与`select`类似,但支持更多文件描述符。面试时,重点讲解`epoll`的高效性和`Reactor`模式,该模式包括一个分发器和多个处理器,用于处理连接和读写事件。Redis采用单线程模型结合`epoll`的Reactor模式,确保高性能。在Redis 6.0后引入多线程,但基本原理保持不变。
38 2
|
1月前
|
Java 调度
Java一分钟之线程池:ExecutorService与Future
【5月更文挑战第12天】Java并发编程中,`ExecutorService`和`Future`是关键组件,简化多线程并提供异步执行能力。`ExecutorService`是线程池接口,用于提交任务到线程池,如`ThreadPoolExecutor`和`ScheduledThreadPoolExecutor`。通过`submit()`提交任务并返回`Future`对象,可检查任务状态、获取结果或取消任务。注意处理`ExecutionException`和避免无限等待。实战示例展示了如何异步执行任务并获取结果。理解这些概念对提升并发性能至关重要。
27 5
|
1月前
|
前端开发 网络协议 JavaScript
如何在前端实现WebSocket发送和接收TCP消息(多线程模式)
请确保在你的服务器端实现WebSocket的处理,以便它可以接受和响应前端发送的消息。同时,考虑处理错误情况和关闭连接的情况以提高可靠性。
66 0
|
1月前
|
Java API
java多线程之FutureTask、Future、CompletableFuture
java多线程之FutureTask、Future、CompletableFuture
|
1月前
|
Java
多线程------Future异步任务
多线程------Future异步任务
|
10月前
|
Java API
多线程进阶学习02------Future异步任务
多线程进阶学习02------Future异步任务
50 0
|
1月前
|
设计模式 安全 Java
多线程设计模式【线程安全、 Future 设计模式、Master-Worker 设计模式 】(一)-全面详解(学习总结---从入门到深化)
多线程设计模式【线程安全、 Future 设计模式、Master-Worker 设计模式 】(一)-全面详解(学习总结---从入门到深化)
34 0