美文网首页
Java多线程Future模式

Java多线程Future模式

作者: aimountain | 来源:发表于2018-11-13 11:30 被阅读0次

    概述

    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模式

          本文链接:https://www.haomeiwen.com/subject/tphkfqtx.html