zoukankan      html  css  js  c++  java
  • 并发中的设计模式-Future

    1.Future设计模式原理是客户端发送一个请求,处理器立即返回一个FutureData数据并且进行异步的获取真正的数据;在客户端真正需要用到实际数据的时候再去获取真正的数据;

    原理图如下:

    2.模拟实现future设计模式:

    (1)定义Data接口

     1 public interface Data {
     2     
     3     /**
     4      * 返回真实数据
     5      *
     6      * @author yin.hl
     7      * @Title: getRealData 
     8      * @return
     9      * @return: String
    10      */
    11     public String getRealData();
    12     
    13 }

    (2)RealData实现Data接口

     1 public class RealData implements Data {
     2 
     3     private String result;
     4 
     5     @Override
     6     public String getRealData() {
     7         return result;
     8     }
     9 
    10     //根据参数初始化数据
    11     public RealData initRealData(String param) {
    12         System.out.println("根据" + param + "进行查询,这是一个很耗时的操作..");
    13         try {
    14             Thread.sleep(5000);
    15         } catch (InterruptedException e) {
    16             e.printStackTrace();
    17         }
    18         System.out.println("操作完毕,获取结果");
    19         result = "查询结果";
    20         return this;
    21     }
    22 
    23 }

    (3)FutureData实现Data接口,该接口中获取真正的数据

     1 public class FutureData implements Data {
     2 
     3     // 真实数据的引用
     4     private RealData realData;
     5     // 标记数据是否准备好了
     6     private boolean isReady = false;
     7 
     8     @Override
     9     public synchronized String getRealData() {
    10         // 如果数据没准备好,则阻塞
    11         if (!isReady) {
    12             try {
    13                 wait();
    14             } catch (InterruptedException e) {
    15                 e.printStackTrace();
    16             }
    17         }
    18         // 返回真实数据,需要使用RealData的方法进行获取
    19         return realData.getRealData();
    20     }
    21 
    22     /**
    23      *
    24      * @author yin.hl
    25      * @Title: initRealData
    26      * @param param
    27      * @return: void
    28      */
    29     public synchronized void initRealData(String param) {
    30         // 如果数据已经准备完毕,就直接返回,释放对象锁
    31         if (isReady) {
    32             return;
    33         }
    34         // 如果数据没有准备完毕则使用参数初始化
    35         realData = new RealData().initRealData(param);
    36         isReady = true;
    37         // 进行通知
    38         notify();
    39     }
    40 
    41 }

    (4)处理器异步初始化真正的数据,并且返回FutureData

     1 public class FutureController {
     2 
     3     public FutureData handler(final String param){
     4         //由于真实的数据还没有准备好,所以返回一个真实Data数据的代理类
     5         final FutureData futureData = new FutureData();
     6         
     7         //2 启动一个新的线程,去加载真实的数据,传递给这个代理对象
     8         new Thread(new Runnable() {
     9             @Override
    10             public void run() {
    11                 futureData.initRealData(param);
    12             }
    13         }).start();
    14         
    15         return futureData;
    16     }
    17 }

    (5)客户端发送请求获取数据

     1 public class Main {
     2 
     3     public static void main(String[] args) throws InterruptedException {
     4         
     5         //1.客户端发送请求,此处的客户端就是Main方法
     6         FutureController fc = new FutureController();
     7         //2.服务端的Controller.handler方法被调用,并传入了参数
     8         //3.此处返回的Data对象为FutureData对象,返回的是Data的代理类
     9         FutureData data = fc.handler("UserId");
    10         System.out.println("请求发送成功...");
    11         System.out.println("继续其他的处理...");
    12         
    13         //3.获取真实数据
    14         System.out.println("Main开始获取真实结果");
    15         String result = data.getRealData();
    16         System.out.println(result);
    17     }
    18 }
  • 相关阅读:
    带你玩转Flink流批一体分布式实时处理引擎
    都2022年了,你的前端工具集应该有vueuse
    云图说|图解DGC:基于华为智能数据湖解决方案的一体化数据治理平台
    面试官: Flink双流JOIN了解吗? 简单说说其实现原理
    4种Spring Boot 实现通用 Auth 认证方式
    这8个JS 新功能,你应该去尝试一下
    Scrum Master需要具备哪些能力和经验
    dart系列之:时间你慢点走,我要在dart中抓住你
    dart系列之:数学什么的就是小意思,看我dart如何玩转它
    dart系列之:还在为编码解码而烦恼吗?用dart试试
  • 原文地址:https://www.cnblogs.com/xuzhiyuan/p/9267188.html
Copyright © 2011-2022 走看看