并行设计模式属于设计优化的一部分,它是对一些常用的多线程结构的总结和抽象.与串行程序相比,并行程序结构更为复杂,因此合理使用并行模式在多线程开发中更具有意义,在这里主要介绍Future,Master-Worker和生产者-消费模型
future模式有点类似与商品订单,比如在网购时,当看重某一个商品时,就可以提交订单,订单处理完成之后,在家里等待送货上门即可, 或者说,更形象的是,我们发送ajax请求的时候,页面是异步地进行后台处理,用户无须一致等待请求的结果,可以继续浏览或操作其他内容 分析:当客户端需要得到真实的数据,而得到真实的数据,可能需要耗费挺长的时间,而如果客户端直接去访问真实的数据,只能一直等这,不能进行别的任务.这就有点 耗时,而且客户端可能并不是立刻就需要这个真实的数据Future模式就是异步去加载这个realData,当客户端需要是就返回给客户端.
过程:客户端不是去直接返回给客户端一个RealData对象,而是返回了一个也实现了Data接口的FutureData对象,这个对象开始的时候,是一个假数据,之后,异步加载 了RealData数据,把RealData设置在FutureData,实际上客户端使用是,再获取到RealData;看看代码的实现:
Data接口: public interface Data { String getRequest(); } 这个接口提供getRequest()方法,获取数据.这个类是客户端返回的一个对象,最开始返回的是一个假的数据,什么都没有,但是因为跟RealData都实现了同样的接口,所以在客户端没啥该表的,都是用Data去接受,用Data的getRequest()方法去获取数据,客户端先返回这个对象给用户,然后再开启另一个线程去获得真正的数据.在查询的过程,RealData在耗时的过程,如果想要调用FutureData的getRequest()方法,是被锁住了,只有,返回了RoleData对象之后,调用FutureData的setRealData()方法之后,才会唤醒等待着的getRequest()方法;
服务端: public class FutureClient { public Data getRequest(String queryStr) { final FutureData futureData = new FutureData(); //开启了一个新贤臣 new Thread(new Runnable() { @Override public void run() { RealData realData = new RealData(queryStr); futureData.setRealData(realData); } }).start(); return futureData; } }这个FutureClient开启了两个线程,一个线程时给用户返回FutureData对象,另一个线程去查询真正的对象,查到了之后,然后set到FutureData()中,供用户去获取:
测试代码: public class Main { public static void main(String[] args) { FutureClient fc = new FutureClient(); Data data = fc.getRequest("请求参数"); System.out.println("请求发送成功"); System.out.println("做其他的事情"); System.out.println(data.getRequest()); } }这是用户在真正去用真实数据RealData还可以走别的代码,不影响其他程序的运行.
这就是Future模式
