内容简介: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设计模式之模板方法模式和建造者模式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Redis开发与运维
付磊、张益军 / 机械工业出版社 / 2017-3-1 / 89.00
本书全面讲解Redis基本功能及其应用,并结合线上开发与运维监控中的实际使用案例,深入分析并总结了实际开发运维中遇到的“陷阱”,以及背后的原因, 包含大规模集群开发与管理的场景、应用案例与开发技巧,为高效开发运维提供了大量实际经验和建议。本书不要求读者有任何Redis使用经验,对入门与进阶DevOps的开发者提供有价值的帮助。主要内容包括:Redis的安装配置、API、各种高效功能、客户端、持久化......一起来看看 《Redis开发与运维》 这本书的介绍吧!