一、模式讲解:
类似是网购,网购发个请求下单,打包、出货、运输等等工作商家就会帮你处理好,你在家等收货就行了
二、模式示意图
流程讲解:
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 }