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模式,后续再讲!

多线程设计模式 - Future模式相关推荐

  1. 多线程基础之设计模式Future模式

    一. Future模式介绍 前面的 Thread-Per-Message 模式将耗时时间的处理交给其他线程, 的确可以提高程序的响应性, 但是在将处理交出去的时候, 处理结果仍是未知的, 而等待处理结 ...

  2. java多线程系列13 设计模式 Future 模式

    Future 模式 类似于ajax请求  页面异步的进行后台请求 用户无需等待请求的结果 就可以继续浏览或者操作 核心就是:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑 ...

  3. 多线程设计模式(二):Future模式

    一.什么是Future模型: 该模型是将异步请求和代理模式联合的模型产物.类似商品订单模型.见下图: 客户端发送一个长时间的请求,服务端不需等待该数据处理完成便立即返回一个伪造的代理数据(相当于商品订 ...

  4. Java多线程编程中Future模式的详解

    转载自 https://www.cnblogs.com/winkey4986/p/6203225.html Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker ...

  5. Java程序性能优化 读书笔记(十)并行设计模式:Future模式

    转载:Java多线程编程中Future模式的详解<转> 参考:葛一鸣,Java程序性能优化.清华大学出版社. 随着多核时代的到来,CPU的并行能力有了很大的提升.在这种背景下,传统的串行程 ...

  6. 学习多线程中的 Future 模式一篇文章就够了 !!!

    文章目录 一.Future 模式 二.Future模式的主要角色 三.Future模式的简单实现 四.JDK中的Future模式 五.Guava对Future模式的支持 一.Future 模式 Fut ...

  7. 多线程Future模式使用

    序 上次分享了多线程与自动任务的风花雪月悲惨结局,今天借此继续分享下多线程带返回结果的基本讨论与实现. 一.使用场景 一个业务方法可能执行时间很长,而我们也不急着摇返回结果,那么就可以用多线程去开启一 ...

  8. Java多线程设计模式(4)线程池模式

    前序: Thread-Per-Message Pattern,是一种对于每个命令或请求,都分配一个线程,由这个线程执行工作.它将"委托消息的一端"和"执行消息的一端&qu ...

  9. java 多线程 临界区_多线程编程的设计模式 临界区模式

    临界区模式 Critical Section Pattern 是指在一个共享范围中只让一个线程执行的模式. 它是所有其它多线程设计模式的基础,所以我首先来介绍它. 把着眼点放在范围上,这个模式叫临界区 ...

最新文章

  1. vb.net与matlab的混合编程
  2. Mask_YOLO_Caffe:基于Mask-RCNN和YOLO检测的工程实现(附源代码)
  3. android Adapter使用详解
  4. 创建 3D 控件_2.设置角色蓝图
  5. PHP数组键值双引号单引号区别
  6. 20155325 2016-2017-2 《Java程序设计》第3周学习总结
  7. python编程软件例子-Python实现扫码工具的示例代码
  8. 实战SSM_O2O商铺_32【商品】商品编辑之Dao层的实现
  9. Fatal error in launcher: Unable to create process using ‘“d:\python3.6\python.exe“ “D:\python3.6\Sc
  10. 高性能MySQL读书笔记---查询优化
  11. flash中Stage,stage,root和this的区别用法
  12. GOF之行为型模式Ⅰ(重点)
  13. 4.云计算和大数据时代网络揭秘-安全的网络通道-网络加密
  14. ThreadLocal 遇上线程池的问题及解决办法
  15. Colorful SegmentedControl
  16. c语言伪常量const理解
  17. [置顶] 话说你最拼命的时候怎样拼命的?
  18. multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
  19. 详解 python 的 切片
  20. Android系统的系统运行库层,Android系统框架

热门文章

  1. 一条空间不足报警的分析
  2. Commons Configuration之一简介
  3. 计算机网络TCP与UDP的区别
  4. wordpress rest api 漏洞又来了CVE-2017-5487 上次是修改文章内容这次可是泄露用户数据...
  5. 全球智能家居市场发展现状及未来趋势分析
  6. bash/shell 解析命令行参数工具:getopts/getopt
  7. 【结构型】Bridge模式
  8. [转].net cookie版购物车
  9. 1.5节 卡诺图以及布尔代数(SOP,POS)part1
  10. 如何将SQL Profiler Trace读入到SQL的表中?