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 }