Java多线程Future模式

概述

Future是未来的意思。有个方法需要运行很长时间才能得到结果。那么,与其一直等待结果,不如先拿一张“提货单”。 获取提货单并不需要很长时间。这里的“提货单”就是我们称为Future角色。

先给你一张提货单。

示例程序

  • Main 向Host发出请求并获取数据的类
  • Host 向请求返回FutureData的实例的类
  • RealData 表示实际数据的类。构造函数的处理会花费很长时间

Main类

public class Main {
  public static void main(String[] args){
    System.out.println("main begin");
    Host  host = new Host();
    Data data1 = host.request(10, "A");
    Data data2 = host.request(20, "B");
    Data data3 = host.request(30, "C");

  System.out.println("main otherJob BEGIN");
  try {
    Thread.sleep(2000);
  } catch (InterruptedException e){}
  System.out.println("main otherJob END");

  System.out.println("data1 = " + data1.getContent());
  System.out.println("data2 =" + data2.getContent());
  System.out.println("data3 =" + data3.getContent());
  System.out.println("main END");

  }
}

Host类

public class Host {
  public Data request(final int count, final char c) {
    System.out.println(" request(" + Count + ", " + c  +" ) BEGIN");
    final FutrueData future = new FutureData();
    new Thread(0 {
      public void run(){
        RealData realdata = new RealData(count, c);
        future.setRealData(readldata); 
      }
    }.start();

    System.out.println("   request(" + count + ", " + c + ") END");
    return future;
  }
}

Data 接口

public interface Data {
  public abstract String getContent();
}

Future 类

public class FutureData implements Data {
  private RealData realdata = null;
  private boolean ready = false;
  public synchronized void setRealData(RealData realdata) {
    if (ready) {
      return;    // balk
    }

    this.realdata =realdata;
    this.ready = true;
    notifyAll();
  }

 public synchronized String getContent() {
   while (!ready){
      try {
        wait();
      } catch (InterruptedException e) {} 
    } 
    return realdata.getContent();
 }
}

RealData 类

public class RealData implements Data {
  private final String content;
  public RealData(int count, char c ) {
    System.out.println("   making RealData(" + count  + ", " + c +") BEGIN");
    char[] buffer = new char[count];
    for (){
      buffer[i] = c;
      try {
        Thread.sleep(100);
      } catch (InterruptedException e){}
     }

     System.out.println("    making RealData(" + count + ", " + c +") END");
     this.content = new String(buffer);
  }

  public String getContent() {
    return  content;
  }
}

Future 模式中的角色

- Client(请求者)
    Client角色向Host角色发出请求(request),并会立即接收到请结果求的处理(返回值)-- VirtualData角色。
   这里接收到的VirtualData角色实际上是Future角色。Client角色没有必要知道返回值究竟是RealData角色还是Future角色。稍后,Client角色会通过VirtualData角色来进行操作。
  • Host
    Host角色会创建新的线程,并开始在新线程中创建RealData角色。同时,它会将Future角色返回给Client橘色。
  • VirtualData (虚拟数据)
    VirtualData 角色是让Future角色与RealData角色具有一致性的角色。
  • RealData ( 真实数据)
    RealData角色是表示真实数据的角色。
  • Future (提货单)
    Future角色就是RealData角色的“提货单“,由Host角色传递给Client角色。

你可能感兴趣的:(Java多线程Future模式)