• Future模式介绍及入门使用


    FutureClient代码实现:

     1 package com.hjf.future;
     2 
     3 public class FutureClient
     4 {
     5     /**
     6      * 请求客户端
     7      * @param queryStr
     8      * @return
     9      */
    10     public Data request(final String queryStr){
    11         //1:创建一个代理对象(Data接口的实现类)先返回给发送请求的客户端,告诉他请求已经接收到,可以做其他的事情
    12         final FutureData fd = new FutureData();
    13         //2:启动一个新的线程,去加载真实的数据,传递给这个代理对象
    14         new Thread(new Runnable()
    15         {
    16             @Override
    17             public void run()
    18             {
    19                 //3:这个新的线程可以去后台加载真实的数据
    20                 RealDate rd = new RealDate(queryStr);
    21                 //4:传递给代理对象
    22                 fd.setRealData(rd);
    23             }
    24         }).start();
    25         //5:返回代理对象
    26         return fd;
    27     }
    28 }

    FutureData代码及实现:

     1 package com.hjf.future;
     2 
     3 public class FutureData implements Data
     4 {
     5     /*真实数据*/
     6     private RealDate realData;
     7     
     8     /*是否加载完成的控制器*/
     9     private boolean isready = false;
    10     
    11     /**
    12      * 装载真实的数据
    13      * @param realData
    14      */
    15     public synchronized void setRealData(RealDate realData)
    16     {
    17         //realData已经装载到FutureData中了,直接返回
    18         if(isready){
    19             return;
    20         }
    21         this.realData = realData;//装载数据
    22         isready = true;//修改控制器
    23         notify();
    24     }
    25     
    26     /**
    27      * 获取请求的最终结果
    28      */
    29     @Override
    30     public synchronized String getRequest()
    31     {
    32         //未加载数据的情况下保持等待 等待状态真实数据完成
    33         while(!isready){
    34             try
    35             {
    36                 wait();
    37             } catch (InterruptedException e)
    38             {
    39                 e.printStackTrace();
    40             }
    41         }
    42         //装载完成时获取数据即可
    43         return this.realData.getRequest();
    44     }
    45 
    46 }

    RealData代码及实现:

     1 package com.hjf.future;
     2 
     3 public class RealDate implements Data
     4 {
     5     /*查询结果*/
     6     private String result;
     7 
     8     public RealDate(String queryStr){
     9         System.out.println("根据 "+queryStr+" 进行查询,这是一个很耗时的操作..");
    10         try
    11         {
    12             //模拟真实的情况
    13             Thread.sleep(5000);
    14         } catch (InterruptedException e)
    15         {
    16             e.printStackTrace();
    17         }
    18         System.out.println("操作完毕,获取数据");
    19         this.result = "查询结果";
    20     }
    21     
    22     /**
    23      * 获取真实的请求数据
    24      * @return
    25      */
    26     @Override
    27     public String getRequest()
    28     {
    29         return result;
    30     }
    31 }

    Data接口代码:

    1 package com.hjf.future;
    2 
    3 public interface Data
    4 {
    5     String getRequest();
    6 }

    测试类代码:

     1 package com.hjf.future;
     2 
     3 public class Main
     4 {
     5     public static void main(String[] args)
     6     {
     7         FutureClient  fc = new FutureClient();
     8         Data data  = fc.request("请求参数");
     9         System.out.println("请求发送成功");
    10         
    11         System.out.println("做其他的事情...");
    12         
    13         String result  = data.getRequest();
    14         System.out.println(result); 
    15     }
    16 }
  • 相关阅读:
    多层缓存、要素缓存
    ASP.NET提供三种主要形式的缓存
    cache、session、cookie的区别
    常用简写快速生成代码
    EF数据迁移
    源文件与模块生成时的文件不同,是否希望调试器使用它?
    强命名程序集组成与作用
    centOS docker运行Asp.net Core程序
    docker
    .net常用的代码生成工具
  • 原文地址:https://www.cnblogs.com/little-fly/p/8902143.html
Copyright © 2020-2023  润新知