• 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 }
  • 相关阅读:
    clear:both其实是有瑕疵的
    CSS3不遥远,几个特性你要知道
    JavaScript使用数组拼接字符串性能如何?
    CSS网页宽度怎么定比较合适
    浅析JavaScript的垃圾回收机制
    淡入淡出效果的js原生实现
    非阻塞式JavaScript脚本及延伸知识
    HTML5 Canvas圣诞树
    Ubuntu查看和自动挂载硬盘
    正则表达式批量重命名
  • 原文地址:https://www.cnblogs.com/billmiao/p/9872204.html
Copyright © 2020-2023  润新知