zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    线程正常终止pthread_exit,pthread_join,pthread_kill,pthread_cancel,sigwait,sigaddset
    线程的创建,pthread_create,pthread_self,pthread_once
    线程和进程的关系
    改变进程的优先级,nice,getpriority,setpriority
    setuid和setgid
    等待进程结束wait,waitpid
    执行新程序以及环境变量
    进程退出exit、_exit、abort
    VBA 判断单元格是否为公式,可用于数组
    ADODB 调用存储过程
  • 原文地址:https://www.cnblogs.com/billmiao/p/9872204.html
Copyright © 2011-2022 走看看