Future模式

一、模式讲解:

类似是网购,网购发个请求下单,打包、出货、运输等等工作商家就会帮你处理好,你在家等收货就行了

二、模式示意图

流程讲解:

1.业务发起请求

2.系统接收到请求,并且立即返回,同时发起真正的请求

3.请求数据真正返回

三、代码实现

  1 package future;
  2 
  3 public class FutureTest {
  4 
  5     public static void main(String[] args) throws InterruptedException {
  6         
  7         FutureClient fc = new FutureClient();
  8         Data data = fc.request("请求参数");
  9         System.out.println("请求发送成功!");
 10         System.out.println("做其他的事情...");
 11         
 12         String result = data.getRequest();
 13         System.out.println(result);
 14         
 15     }
 16 }
 17 
 18 interface Data {
 19 
 20     String getRequest();
 21 
 22 }
 23 
 24 class FutureClient {
 25 
 26     public Data request(final String queryStr){
 27         //1 我想要一个代理对象(Data接口的实现类)先返回给发送请求的客户端,告诉他请求已经接收到,可以做其他的事情
 28         final FutureData futureData = new FutureData();
 29         //2 启动一个新的线程,去加载真实的数据,传递给这个代理对象
 30         new Thread(new Runnable() {
 31             @Override
 32             public void run() {
 33                 //3 这个新的线程可以去慢慢的加载真实对象,然后传递给代理对象
 34                 RealData realData = new RealData(queryStr);
 35                 futureData.setRealData(realData);
 36             }
 37         }).start();
 38 
 39         return futureData;
 40     }
 41 
 42 }
 43 
 44 class FutureData implements Data{
 45 
 46     private RealData realData ;
 47 
 48     private boolean isReady = false;
 49 
 50     public synchronized void setRealData(RealData realData) {
 51         //如果已经装载完毕了,就直接返回
 52         if(isReady){
 53             return;
 54         }
 55         //如果没装载,进行装载真实对象
 56         this.realData = realData;
 57         isReady = true;
 58         //进行通知
 59         notify();
 60     }
 61 
 62     @Override
 63     public synchronized String getRequest() {
 64         //如果没装载好 程序就一直处于阻塞状态
 65         while(!isReady){
 66             try {
 67                 wait();
 68             } catch (InterruptedException e) {
 69                 e.printStackTrace();
 70             }
 71         }
 72         //装载好直接获取数据即可
 73         return this.realData.getRequest();
 74     }
 75 
 76 
 77 }
 78 
 79 
 80 class RealData implements Data{
 81 
 82     private String result ;
 83 
 84     public RealData (String queryStr){
 85         System.out.println("根据" + queryStr + "进行查询,这是一个很耗时的操作..");
 86         try {
 87             Thread.sleep(5000);
 88         } catch (InterruptedException e) {
 89             e.printStackTrace();
 90         }
 91         System.out.println("操作完毕,获取结果");
 92         result = "查询结果";
 93     }
 94 
 95     @Override
 96     public String getRequest() {
 97         return result;
 98     }
 99 
100 }
原文地址:https://www.cnblogs.com/billmiao/p/9872204.html