内容简介:Future模式是多线程开发中非常常见的一种设计模式。它的核心思想是异步调用。当我们需要调用一个函数方法时。如果这个函数执行很慢,那么我们就要进行等待。但有时候,我们可能并不急着要结果。因此,我们可以让被调用者立即返回,让他在后台慢慢处理这个请求。对于调用者来说,则可以先处理一些其他任务,在真正需要数据的场合再去尝试获取需要的数据。就像我们在网上购物,你买了一个包之后会给你生成一个电子的订单凭证,你只需要持有凭证等待包送过来就行了,这期间你可以做其他你想做的事情。对于Future模式来说,它无法立即返回你需
Future模式是多线程开发中非常常见的一种设计模式。它的核心思想是异步调用。当我们需要调用一个函数方法时。如果这个函数执行很慢,那么我们就要进行等待。但有时候,我们可能并不急着要结果。因此,我们可以让被调用者立即返回,让他在后台慢慢处理这个请求。对于调用者来说,则可以先处理一些其他任务,在真正需要数据的场合再去尝试获取需要的数据。
就像我们在网上购物,你买了一个包之后会给你生成一个电子的订单凭证,你只需要持有凭证等待包送过来就行了,这期间你可以做其他你想做的事情。
对于Future模式来说,它无法立即返回你需要的数据,但是它会返回一个契约,将来你可以凭借这个契约去获取你需要的信息。
2 Future模式和非Future模式的区别
在传统的同步方法中调用一些耗时的程序,需要等待一个方法完成后才能进行下一步。而Future模式中客户端调用完成后并不急于去做处理,而去调用其他的业务,这样充分利用了时间,这就是Future模式的核心。
3 Future模式的主要成员
- Main:系统启动,调用client发送请求。
- Client:返回Data对象,立即返回FutureData,并开启ClientThread线程装配RealData。
- Data:返回数据的接口。
- FutureData:Future数据构造快,但是是一个虚拟的数据,需要装配RealData。
- RealData:真实数据。
4 Future模式的简单实现
Data接口,这个是客户端希望得到的数据。
public interface Data { public String getResult(); } 复制代码
RealData是最终需要使用的数据模型,使用sleep()模拟构造过程。
public class RealData implements Data { public final String result; public RealData(String result) { System.out.println("RealData start " + System.currentTimeMillis()); //模拟构造时间长 StringBuffer sb = new StringBuffer(); for (int i = 0;i<10;i++){ sb.append(result); try{ Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("RealData end " + System.currentTimeMillis()); this.result = sb.toString(); } @Override public String getResult() { return result; } } 复制代码
FutureData实现一个快速返回RealData包装
public class FutureData implements Data { public RealData realData = null; public boolean isReady = false; public synchronized void setRealData(RealData realData){ if (isReady){ return; } this.realData = realData; isReady = true; this.notifyAll(); //realData已经被注入 通知getResult启动 } @Override public synchronized String getResult() { while (!isReady){ try { System.out.println("wait start " + System.currentTimeMillis()); this.wait(); //等待realData被注入 } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("wait end " + System.currentTimeMillis()); return realData.result; } } 复制代码
客户端主要实现获取FutureData,开启构造RealData线程。
main方法调用发起请求。
public class Client { public Data request(final String queryStr){ final FutureData future = new FutureData(); new Thread(){ @Override public void run(){ System.out.println("run start " + System.currentTimeMillis()); RealData realData = new RealData(queryStr); System.out.println("run end " + System.currentTimeMillis()); future.setRealData(realData); } }.start(); //立即返回futureData return future; } public static void main(String[] args) { Client client = new Client(); //返回的futureData Data data = client.request("name"); System.out.println("请求完成"); try{ Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("main end"); System.out.println(System.currentTimeMillis()); System.out.println("真实数据"+data.getResult()); } } 复制代码
以上所述就是小编给大家介绍的《java-23种设计模式-Future模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 设计模式——订阅模式(观察者模式)
- 设计模式-简单工厂、工厂方法模式、抽象工厂模式
- java23种设计模式-门面模式(外观模式)
- 设计模式-享元设计模式
- Java 设计模式之工厂方法模式与抽象工厂模式
- JAVA设计模式之模板方法模式和建造者模式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Designing for Emotion
Aarron Walter / Happy Cog / 2011-10-18 / USD 18.00
Make your users fall in love with your site via the precepts packed into this brief, charming book by MailChimp user experience design lead Aarron Walter. From classic psychology to case studies, high......一起来看看 《Designing for Emotion》 这本书的介绍吧!