一、什么是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. js对敏感词的判断

    先贴代码: //定义敏感字符 var forbiddenArray =['xx','<','>','黄色']; //定义函数 function forbiddenStr(str){ // ...

  2. css中所有的选择器

    认识css中所有的选择器 什么是选择器 每一条样式申明(定义)由两部分组成 选择器{ 样式:    } 标签选择器 p{ font-size:12px:  line-height:1.6em;     ...

  3. Clang之语法抽象语法树AST

    语法分析器的任务是确定某个单词流是否能够与源语言的语法适配,即设定一个称之为上下文无关语言(context-free language)的语言集合,语法分析器建立一颗与(词法分析出的)输入单词流对应的 ...

  4. Ubuntu 简单安装 Docker

    服务器版本 Ubuntu 16.04 LTS. 1. 普通安装 安装命令: 更新程序包索引,以及添加使用 HTTPS 传输的软件包以及 CA 证书. $ sudo apt-get update $ s ...

  5. 【Ubuntu 16】安装ssh

    ubuntu16默认使用ufw(Uncomplicated FireWall 继承自 iptables)管理防火墙,使用gufw图形化界面方便管理, 默认情况下openssh-server没有安装. ...

  6. Vim中常用的命令行

    Vim中常用的命令行... ------------------- 一些真正强大的武器总不是那么容易驾驭的,主角总得付出一些努力才能收获到更加强大的力量,对于 Vim 这种上古神器来说更是如此.由于它 ...

  7. 一文看懂web服务器、应用服务器、web容器、反向代理服务器区别与联系

    我们知道,不同肤色的人外貌差别很大,而双胞胎的辨识很难.有意思的是Web服务器/Web容器/Web应用程序服务器/反向代理有点像四胞胎,在网络上经常一起出现.本文将带读者对这四个相似概念如何区分. 1 ...

  8. mysql排序

    MySQL里desc和asc的意思    desc是descend 降序意思     asc 是ascend 升序意思    sql = "select 表内容名    from   数据库 ...

  9. uva11991 Easy Problem from Rujia Liu?

    Though Rujia Liu usually sets hard problems for contests (for example, regional contests like Xi'an ...

  10. 我理解的Java中重载与重写

    程序中我们用方法来实现对对象的操作,但是对象可能有不同的数据类型,这时候对不同的数据类型,进行相同的操作,我们就可以用到方法的重载,即方法名相同,但是具有不同的参数列表. 方法的重载可以根据传递参数的 ...