Future模式
相似于用户提交商品订单,下单成功之后后台异步的执行耗时的业务
在java.util.concurrent包中.Future接口是Java线程Future模式的实现,能够来进行异步计算。java
1.定义一个接口来处理请求异步
public interface Data{ String getRequest(); }
2.定义一个转发请求的客户端测试
public class FutureClient{ public Data request(final String queryStr){ //1.添加一个代理对象(Data接口的实现类) 先返回给发送请求的客户端 //告诉客户端收到请求,能够处理其余事情 final FutureData futureData = new FutureData(); //2.启动一个新的线程 去加载真实的数据 传递给这个代理对象 new Thread(new Runnable(){ public void run(){ //3这个新的线程能够去慢慢的加载真实对象 //而后传递给代理对象 RealData realData = new RealData(queryStr); futureData.setRealData(realData); } }).start(); return futureData; } }
3.定义一个代理类来返回数据this
public class FutureData implements Data{ private RealData realData; private boolean isReady = false; public void synchronized void setRealData(RealData realData){ //若是已经转载完毕 直接返回 if(iReady){ return; } //若是没有装载,进行装载真实对象 this.realData = realData; isReady = true; //进行通知 notify(); } public synchronized String getRequest(){ //若是没有装载好 程序就一直处于阻塞的状态 while(!isReady){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //装载好直接获取数据便可 return this.realData.getRequest(); } }
4.定义一个处理大量耗时操做的类spa
public class RealData implements Data{ private String result; public RealData(String queryStr){ System.out.println("根据" + queryStr + "进行查询, 这是一个很耗时的操做.."); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("操做完毕,获取结果"); result = "查询结果"; } public String getRequest(){ retun result; } }
5.定义一个测试类线程
public class Main{ public static void main(String[] args) throws InterruptedException { FutureClient fc = new FutureClient(); Data data = fc.request("发送请求"); System.out.println("请求发送成功!"); System.out.println("作其余的事情..."); String result = data.getRequest(); System.out.println(result); } }
结果以下代理