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 }
  • 相关阅读:
    VUE 多页面配置(二)
    VUE 多页面配置(一)
    VUE (vue-cli)脚手架项目说明
    CSS 三角形与圆形
    协同过滤算法之组合加权评分
    用户投票算法
    Android开发学习总结(一)——搭建最新版本的Android开发环境
    关于统计变换(CT/MCT/RMCT)算法的学习和实现
    SIFT 特征提取算法总结
    Android Listener侦听的N种写法
  • 原文地址:https://www.cnblogs.com/xuzhiyuan/p/9267188.html
Copyright © 2011-2022 走看看