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 }
原文地址:https://www.cnblogs.com/little-fly/p/8902143.html