A-A+

大话Future模式

2016年05月17日 Java 暂无评论 阅读 785 views 次

说在前面的话

什么是Future 模式呢?对于多线程,如果线程A要等待线程B的结果,那么线程A没必要等待B,直到B有结果,可以先拿到一个未来的Future,等B有结果是再取真实的结果。其实这个模式用的很多,比如浏览器下载图片的时候,刚开始是不是通过模糊的图片来代替最后的图片,等下载图片的线程下载完图片后在替换。

Future

思想

future2

实例

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

  1. package com.ifcoding.future;
  2. public class Main {
  3.     public static void main(String[] args) {
  4.         //1. 创建client
  5.         Client client = new Client();
  6.         //2. client请求,得到FutureData
  7.         Data data = client.request("name");
  8.         System.out.println("请求完毕!");
  9.         try {
  10.             Thread.sleep(2000);
  11.         } catch (Exception e) {
  12.         }
  13.         System.out.println("数据=" + data.getResult());
  14.     }
  15. }

Client:返回Data对象,立即返回FutureData,并开启ClientThread线程装配RealData

  1. package com.ifcoding.future;
  2. public class Client {
  3.     public Data request(final String queryStr) {
  4.         final FutureData future = new FutureData();
  5.         new Thread(){
  6.             @Override
  7.             public void run() {
  8.                 RealData realdata = new RealData(queryStr);
  9.                 future.setRealData(realdata);
  10.             }
  11.         }.start();
  12.         return future;
  13.     }
  14. }

Data:返回数据的接口

  1. package com.ifcoding.future;
  2. public interface Data {
  3.     public String getResult();
  4. }

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

  1. package com.ifcoding.future;
  2. public class FutureData implements Data {
  3.     protected RealData realdata = null;
  4.     protected boolean isReady = false;
  5.     public synchronized void setRealData(RealData realdata) {
  6.         if (isReady) {
  7.             return;
  8.         }
  9.         this.realdata = realdata;
  10.         isReady = true;
  11.         notifyAll();
  12.     }
  13.     @Override
  14.     public String getResult() {
  15.         if (!isReady) {
  16.             try {
  17.                 wait();
  18.             } catch (Exception e) {
  19.             }
  20.         }
  21.         return realdata.result;
  22.     }
  23. }

RealData:真实数据,其构造是比较慢的

  1. package com.ifcoding.future;
  2. public class RealData implements Data{
  3.     public final String result;
  4.     public RealData(String queryStr) {
  5.         StringBuffer sb = new StringBuffer();
  6.         for (int i = 0; i < 10; i++) {
  7.             sb.append(queryStr + " ");
  8.             try {
  9.                 Thread.sleep(100);
  10.             } catch (Exception e) {
  11.             }
  12.         }
  13.         result = sb.toString();//实际要获得数据
  14.     }
  15.     @Override
  16.     public String getResult() {
  17.         return result;
  18.     }
  19. }

给我留言

*

Copyright © If Coding 保留所有权利.   Theme  Ality   

用户登录