一、什么是Future模型:

该模型是将异步请求和代理模式联合的模型产物。类似商品订单模型。见下图:

客户端发送一个长时间的请求,服务端不需等待该数据处理完成便立即返回一个伪造的代理数据(相当于商品订单,不是商品本身),用户也无需等待,先去执行其他的若干操作后,再去调用服务器已经完成组装的真实数据。该模型充分利用了等待的时间片段。

 二、Future模式的核心结构:

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

Client:返回Data对象,理解返回FutureData,并开启ClientThread线程装配RealData;

Data:返回数据的接口;

FutureData:Future数据,构造很快,但是是一个虚拟的数据,需要装配RealData;

RealData:真实数据,构造比较慢。

三、Future模式的代码实现:

(1)Main函数:

[java] view plaincopy
  1. <span style="font-size:18px;">package tgb;
  2. public class Main {
  3. public static void main(String[] args){
  4. Client client = new Client();
  5. //理解返回一个FutureData
  6. Data data = client.request("name");
  7. System.out.println("请求完毕!");
  8. try{
  9. //处理其他业务
  10. //这个过程中,真是数据RealData组装完成,重复利用等待时间
  11. Thread.sleep(2000);
  12. }catch (Exception e){
  13. }
  14. //真实数据
  15. System.out.println("数据 = "+ data.getResult());
  16. }
  17. }
  18. </span>

(2)Client的实现:

[java] view plaincopy
  1. <span style="font-size:18px;">package tgb;
  2. public class Client {
  3. public Data request(final String queryStr){
  4. final FutureData future = new FutureData();
  5. //开启一个新的线程来构造真实数据
  6. new Thread(){
  7. public void run(){
  8. RealData realData = new RealData(queryStr);
  9. future.setRealData(realData);           }
  10. }.start();
  11. return future;
  12. }
  13. }
  14. </span>

(3)Data的实现:

[java] view plaincopy
  1. <span style="font-size:18px;">package tgb;
  2. public interface Data {
  3. public  String getResult();
  4. }
  5. </span>

(4)FutureData:

[java] view plaincopy
  1. <span style="font-size:18px;">package tgb;
  2. /**
  3. * 是对RealData的一个包装
  4. * @author limin
  5. *
  6. */
  7. public class FutureData implements Data {
  8. protected RealData realData =null;
  9. protected boolean isReady = false;
  10. public synchronized void setRealData(RealData realData){
  11. if(isReady){
  12. return;
  13. }
  14. this.realData=realData;
  15. isReady=true;
  16. notifyAll();
  17. }
  18. @Override
  19. public  synchronized  String getResult() {
  20. while(!isReady){
  21. try{
  22. wait();
  23. }catch (Exception e){
  24. }
  25. }
  26. return realData.result;
  27. }
  28. }
  29. </span>

(5)RealData实现:

[java] view plaincopy
  1. <span style="font-size:18px;">package tgb;
  2. public class RealData implements Data {
  3. protected  String  result;
  4. public RealData(String para){
  5. //构造比较慢
  6. StringBuffer sb= new StringBuffer();
  7. for(int i=0;i<10;i++){
  8. sb.append(para);
  9. try{
  10. Thread.sleep(1000);
  11. }catch(Exception e){
  12. }
  13. result= sb.toString();
  14. }
  15. }
  16. @Override
  17. public String getResult() {
  18. return result;
  19. }
  20. }
  21. </span>

注意:

FutureData是对RealData的包装,是dui真实数据的一个代理,封装了获取真实数据的等待过程。它们都实现了共同的接口,所以,针对客户端程序组是没有区别的;

客户端在调用的方法中,单独启用一个线程来完成真实数据的组织,这对调用客户端的main函数式封闭的;

因为咋FutureData中的notifyAll和wait函数,主程序会等待组装完成后再会继续主进程,也就是如果没有组装完成,main函数会一直等待。

转:http://blog.csdn.net/lmdcszh/article/details/39696357

转载于:https://www.cnblogs.com/duanxz/p/5143138.html

多线程设计模式(二):Future模式相关推荐

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

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

  2. 大话设计模式(二)代理模式

    大话设计模式(二)代理模式 前言 代理模式(Proxy Pattern)是GoF 23种Java常用设计模式之一.代理模式的定义:Provide a surrogate or placeholder ...

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

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

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

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

  5. java设计模式 (二) 创建模式

    java设计模式 (二) 创建型模式 单例模式 Singleton pattern 现实场景 双11, 小华收快递, 早上圆通快递叫他下楼收快递, 刚上来, 顺丰快递叫他下楼收快递,.然后没多久EMS ...

  6. 设计模式之Future模式——提交任务后立即得到一个Future对象,后面利用该对象得到具体的执行结果。加上回调功能,任务执行结束通知调用者或直接回调相应方法

    1. Future模式的实现逻辑 1.1 在具体实现之前,我们先将Future模式的实现逻辑和流程理清楚,然后编写代码. 1.2 以甜品店买奶茶为例.第一步:得先有服务员:第二步:我们提交一个奶茶订单 ...

  7. 并发程序设计模式之Future模式

    Future模式有点类似商品订单.比如在进行网上购物时,当看中某一件商品时,就可以提交订单.当订单处理完毕后,便可在家等待商品送货上门.卖家根据订单从仓库里取货,并配送到客户手上.在大部分情况下,商家 ...

  8. 多线程设计模式-线程池模式

    定义: 使用极其有限的资源(线程池)去处理相对无限的任务 线程池模式UML图 ThreadPool: 负责接收和存储任务以及工作者线程的生命周期管理     submit: 用于接收一个任务,客户端代 ...

  9. 设计模式(二)-------------- 工厂模式

    这篇博客我想来说一下关于工厂模式的一些知识,工厂模式在Spring框架中运用是十分广泛的.由于Spring的控制反转思想,使得我们的一些bean都交由BeanFactory统一进行管理. 那么今天我就 ...

  10. 设计模式(二) ——工厂模式 (3种工厂模式的实现及优缺点)

    1. 工厂模式介绍 工厂模式(Factory Pattern) 是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.在工厂模式中,我们在创建对象时不 ...

最新文章

  1. 4道经典指针笔试题讲解 ~
  2. Mac OS X10.11(OS X EI Capitan)安装程序下载
  3. vue 带全选和多选的表格怎么写_vue实现下拉列表多选全选以及模糊查询的vue组件...
  4. 开发日记-20190423 关键词 android静态代理类代理方法打断点debug 退出当前activity 闪退
  5. python做好的程序如何变成小程序-使用python编写简单的小程序编译成exe跑在win10上...
  6. 删除git commit 的 UserInterfaceState.xcuserstate 文件
  7. linux 虚拟机同步时间
  8. vim 分屏 最大化_5分钟学会Vim分屏操作方方面面
  9. go语言csv文件的读取与写入
  10. java 秒杀多线程_秒杀多线程系列 - 随笔分类 - Joyfulmath - 博客园
  11. Android 使用imageLoader来加载显示图片
  12. pycharm-python文件注释头
  13. MAC OS上将项目提交到github
  14. 【算法】斐波那契(黄金分割法) 查找算法
  15. python算法程序_浅谈python常用程序算法
  16. springMVC 项目在jboss7中配置应用自己的log4j
  17. 随机变量统计独立性的相关证明
  18. echarts realtime图实现
  19. 我的Python开发之路---微信网页授权(扫码登陆)
  20. linux运维要掌握哪些,学习Linux运维需要掌握哪些技能?Linux运维

热门文章

  1. ​618购物节,我用python逛淘宝、亚马逊,摸鱼被领导发现了
  2. Linux系统管理(5)——使用yum快速搭建LAMP环境【方便快捷版】
  3. 银行有没有必要建立数据中台?看看这些架构师和技术总监怎么说
  4. 少数人知道的公式+思路,财务报表自动生成,财务总监用了5年
  5. 深入了解帆软报表系统的启动过程一
  6. 通过F12控制台退订育碧(Ubisoft)邮件
  7. python字符串转义表
  8. python魔法方法和普通方法_Python魔法方法之属性访问详解!
  9. edge无法打印pdf_一文搞定PDF无法复制/打印/编辑
  10. python属于哪类型的编程语言_Python是什么类型的编程语言,有什么特性