Java多线程Future模式

2018-11-13  本文已影响0人  aimountain

概述

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

先给你一张提货单。

示例程序

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角色来进行操作。
上一篇 下一篇

猜你喜欢

热点阅读