一、什么是Future模型:

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

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

 二、Future模式的核心结构:

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

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

Data:返回数据的接口;

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

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

三、Future模式的代码实现:

(1)Main函数:

  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的实现:

  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的实现:

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

(4)FutureData:

  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实现:

  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

多线程:多线程设计模式(二):Future模式的更多相关文章

  1. 多线程的设计模式:Future、Master-Worker

    一 简介 并行设计模式属于设计优化的一部分,它是对一些常用的多线程结构的总结和抽象.与串行程序相比,并行程序的结构通常更为复杂,因此合理的使用并行模式在多线程开发中更具有意义,在这里主要介绍==Fut ...

  2. 多线程(10) — Future模式

    Future模式是多线程开发中常用常见的一种设计模式,它的核心思想是异步调用.在调用一个函数方法时候,如果函数执行很慢,我们就要进行等待,但这时我们可能不着急要结果,因此我们可以让被调者立即返回,让它 ...

  3. 多线程学习之二坚不可摧模式Immutable pattern

    Immutable pattern[坚不可摧模式] 一:immutable pattern的参与者--->immutable(不变的)参与者        1.1:immutable参与者是一个 ...

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

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

  5. 多线程设计模式——Read-Write Lock模式和Future模式分析

    目录 多线程程序评价标准 任何模式都有一个相同的"中心思想" Read-Write Lock 模式 RW-Lock模式特点 冲突总结 手搓RW Lock模式代码 类图 Data类 ...

  6. 多线程设计模式 - Future模式

    Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用.这类似我们日常生活中的在线购物流程,带在购物网看着一件商品时可以提交表单,当订单完成后就可以在家里等待商品送货上门.或者说 ...

  7. 13.多线程设计模式 - Future模式

    多线程设计模式 - Future模式 并发设计模式属于设计优化的一部分,它对于一些常用的多线程结构的总结和抽象.与串行相比并行程序结构通常较为复杂,因此合理的使用并行模式在多线程并发中更具有意义. 1 ...

  8. 多线程设计模式 - Future模式之JAVA原生实现

    在之前一篇博客中介绍了Future设计模式的设计思想以及具体实现,今天我们来讲一下使用JDK原生的包如何实现. JDK内置的Future主要使用到了Callable接口和FutureTask类. Ca ...

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

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

随机推荐

  1. leetcode First Bad Version(二分查找)

    You are a product manager and currently leading a team to develop a new product. Unfortunately, the ...

  2. M4——GPIO配置

    1.GPIO 简述: 通用输入输出(General Purpose Input Output)的简称,就是芯片引脚可以通过他们输出高电平或者低电平,也可以通过他们读取引脚的电平状态. 以STM32F4 ...

  3. 轻量级ORM框架 QX_Frame.Bantina(二、框架使用方式介绍)

    轻量级ORM框架QX_Frame.Bantina系列讲解(开源) 一.框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html 二.框架使用方式介 ...

  4. HTML基础进阶

    [toc] HTML表单 form标签 <form> 标签代表一个表单,表单用于向服务器传输数据. 标签能够包含 <input> ,可以是文本字段,复选框,单选框或提交按钮等. ...

  5. iOS 工程自动化 - 思路整理

    4 月份参加 2017@Swift 大会的时候有幸听到了 @zesming 大佬关于美团组件化的 Topic,有一张图印象特别深刻. 来自 @zesming 大佬 后来跟 @zesming 大佬沟通怎 ...

  6. 【Ubuntu Desktop】VMware 中 Unknown Display

    由于之前重复的安装卸载Unity桌面,今天遇到了在设置虚拟机分辨率的时候,遇到了Unknown Display问题 参考网上内容 使用 xrandr调节分辨率 xrandr只能在虚拟机本地终端执行,不 ...

  7. spring boot / cloud (一) 使用filter防止XSS

    spring boot / cloud (一) 使用filter防止XSS 前言 XSS(跨站脚本攻击) 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading ...

  8. java web轻量级开发面试教程摘录,java web面试技巧汇总,如何准备Spring MVC方面的面试

    本内容摘自 java web轻量级开发面试教程 https://baike.baidu.com/item/Java%20Web%E8%BD%BB%E9%87%8F%E7%BA%A7%E5%BC%80% ...

  9. JSP的四个作用域

    JSP的作用域一般是对于变量而言的,描述的是变量在某处是否有效(可用) JSP的四个作用域       名称          作用域       page 当前页面有效 request 当前请求中有 ...

  10. spring基于注解进行注入(个人记录)

    spring的Bean基于注解进行配置,再结合自动装配属性,也就DI,其实说白了就相当于初始化的时候给对象赋初值. 配置文件的过程有些麻烦,记录一下. 基于注解进行配置: 1.在application ...