一、什么是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. 多线程设计模式——Read-Write Lock模式和Future模式分析

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

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

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

  3. Java多线程编程中Future模式的详解<转>

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

  4. 多线程手写Future模式

    future模式 在进行耗时操作的时候,线程直接阻塞,我们需要优化这样的代码,让他再启动一个线程,不阻塞.可以执行下面的代码. 这个时候我们就用到了未来者模式 future设计类 只有一个方法 pub ...

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

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

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

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

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

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

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

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

  9. 多线程集成设计模式--future模式

    多线程开发可以更好的发挥多核cpu性能,常用的多线程设计模式有:Future.Master-Worker.Guard Susperionsion 一.什么是Future模型: 该模型是将异步请求和代理 ...

随机推荐

  1. FZU 1759 Super A^B mod C 指数循环节

    Problem 1759 Super A^B mod C Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description G ...

  2. hdu 5920 Wool 思路

    Wool Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Problem D ...

  3. C++(十八) — 内存模式、堆和栈

    1.内存模式 一个程序执行时,先复制到内存,然后CPU逐句读取指令执行. 每个存储单元存放一个字节(8bit)数据,每个有一个唯一的地址,地址是顺序编码的.比如:一台计算机256MB内存,则有256* ...

  4. 7z压缩gopath的src的批处理

    7zGoPath.bat @echo off pushd "%~dp0" :config for /f "delims=" %%t in ('powershel ...

  5. week05《Java程序设计》第五次学习总结

    week05<Java程序设计>第五次学习总结 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 答:关键词:接口,inteface关键词,implement关键词, ...

  6. 接口取不到POST参数

    利用类似httprequester小工具调试API时偶尔出现一直取不到POST的数据 解决方式: 1.$_POST['paramName']: 只能接收Content-Type: applicatio ...

  7. Android 发布Apk签名

    1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本 ...

  8. HihoCoder 1158 : 质数相关 (最大独立集)

    质数相关 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 两个数a和 b (a<b)被称为质数相关,是指a × p = b,这里p是一个质数.一个集合S被称为质数相关 ...

  9. 接口测试基础——第4篇logging模块

    Logging:日志记录是为了跟踪记录软件运行时,发生的事件,包括出错,提示信息等等. log日志级别:日志级别大小关系为:CRITICAL > ERROR > WARNING > ...

  10. c# 统计运行时间

    long startTime = Environment.TickCount; long endTime = Environment.TickCount; long totalTime = endTi ...