一、什么是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

最新文章

  1. Linux串口中的超时设置
  2. openWrt 安装与实践 II
  3. 拓扑排序(三)之 Java详解
  4. 网络热恋之json解析
  5. linux C学习笔记03--单链表
  6. python学习笔记22(group)
  7. (3)java棧
  8. 浏览器兼容问题汇总&lt;转&gt;
  9. 真实故事:网站遭遇DOS攻击
  10. Linux C++程序进行性能分析工具gprof使用入门
  11. PHP 7.2 新功能介绍
  12. MUI框架 按钮点击响应不好的问题解决办法
  13. 1GB pages can only be allocated at boot time using hugepages= and not freed afterwards
  14. Confluence 6 MySQL 数据库设置准备
  15. pandas的to_csv()使用方法
  16. jqgrid 行选中multiboxonly属性说明
  17. python之shutil模块详解
  18. 谨防in、or 公用性能问题
  19. 【Android】添加依赖包
  20. Ajax编程(HTTP请求与响应及API)详解

热门文章

  1. 英语发音规则---A字母
  2. spring3: Bean的命名与Bean的实例化
  3. easyui datagrid 行编辑功能
  4. 【Java】方法的重载与重写
  5. MVC框架中的值提供机制(一)
  6. 【PAT-L2-020】功夫传人
  7. Struts06---通配符的使用
  8. request.setAttribute(&quot;username&quot;, username);//一定要保存,OGNL才能获取${username}
  9. 不用配置 , 快速搭建react环境
  10. Activity has leaked window that was originally added(以解决)