闲谈Future模式-订蛋糕
一、 Future模式简介
Future有道翻译:n. 未来;前途;期货;将来时。我觉得用期货来解释比较合适。举个实际生活中例子来说吧,今天我女朋友过生日,我去蛋糕店准备给女朋友定个大蛋糕,超级大的那种。
“老板,我要个最大最漂亮的蛋糕”
“好,999元,先付款吧”
“这么贵!!!”想想还是买了吧,掏了钱,付了款,老板给我一张蛋糕票。
“下午过来取。下午拿这张蛋糕票过来拿蛋糕”
“纳尼,这么久”
“没有办法,你可以选择在这等,我们会马上开做,不过我建议你还是去干点别的,去买个花什么的,那样您女朋友会更开心的”
……
下午一点钟我早早的就到蛋糕店了。
“老板,我的蛋糕呢?”
“不好意思,还没做好,您稍微等一会”
“晕”
十分钟后,我终于拿我的蛋糕票取到了送给女朋友的超级大蛋糕了。
这就是Future模式,蛋糕就是我要的数据(RealData),去蛋糕店订蛋糕就是我调用取数据的方法,付完钱,我没有真的拿到蛋糕,只是一个蛋糕票(FutureData),要取数据就是拿这个蛋糕票(FutureData)取(get)蛋糕(RealData)。取的时候蛋糕可能还没有做好,你还是要等,如果做好了,你直接拿走就行了。这种模式的好处就是你不用一直在等着蛋糕出来,做蛋糕的时间你可以去做别的事。有一点就是你不能准确的知道多久能做好蛋糕,很有可能来早了,还是要等,但是没有关系,总比一直在等着强吧。
二、 代码实现
public interface ICake {String getName(); }public class RealCake implements ICake{public RealCake(){try {//造蛋糕好费时间的Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}public String getName() {return "最大最好吃的蛋糕";} } public class CakeTicket implements ICake {private RealCake cake;public synchronized String getName() {while(cake==null){try {//还没有做好,等待... wait();} catch (InterruptedException e) {e.printStackTrace();}}return cake.getName();}public synchronized void setCake(RealCake cake) {this.cake = cake;//做好了,可以取蛋糕了 notifyAll();}}public class CakeShop {//获取蛋糕的方法public static ICake getCake(){//构造一个虚拟数据返回给客户,这只是个虚拟的结果,相当给了客户一张取结果的卡,但是客户最好不要//急着取结果,因为结果数据一般需要一定时间构造,客户最好去干点别的,过一会再来取final CakeTicket cake = new CakeTicket();//使用一个线程去构造真实的数据,为何要用线程,因为这个资源构造比较费时new Thread(new Runnable(){public void run() {RealCake realData = new RealCake();cake.setCake(realData);}}).start();return cake;} }public class Me {public static void main(String[] args) {ICake cake = CakeShop.getCake();System.out.println("买花去喽");//dosomethingSystem.out.println("蛋糕的名字:"+cake.getName());} }
Java5提供了一个可以带返回值的线程实现,名字就叫Future,看了一下,发现也就是Future模式,可以直接用就可以了。
public static Future<RealCake> getCake(){ExecutorService threadpool = Executors.newCachedThreadPool();Future<RealCake> futureData = threadpool.submit(new Callable<RealCake>() {public RealCake call() throws Exception {RealCake realCake = new RealCake();return realCake;}});return futureData;} public static void main(String[] args) throws InterruptedException, ExecutionException {Future<RealCake> cake = CakeShop4Future.getCake();System.out.println("买花去喽");//dosomethingSystem.out.println("蛋糕的名字:"+cake.get().getName());}
三、 使用场景
一个请求要获取地图的图片,以及一些位置信息,由于地图图片的生成比较费时,那么我们利用Future模式,让一个生成地图的线程慢慢生成图片,而获取位置信息也可以同时进行,不必等到图片生成完了再去获取位置信息。
Future模式解决的问题是让本来顺序执行的事情,变成可以同时执行。
转载于:https://www.cnblogs.com/xumanbu/p/4187010.html
闲谈Future模式-订蛋糕相关推荐
- 从理解Future模式到仿写JUC的Future模式
1.Future模式 过生日,在线上定蛋糕的例子可以形象的解释Future模式. 两个步骤: 1.下单 - 委托制作蛋糕:你在线定下单订蛋糕,将制作蛋糕的工作委托给了蛋糕店. 2.取蛋糕:凭着在线支付 ...
- 设计模式之Future模式——提交任务后立即得到一个Future对象,后面利用该对象得到具体的执行结果。加上回调功能,任务执行结束通知调用者或直接回调相应方法
1. Future模式的实现逻辑 1.1 在具体实现之前,我们先将Future模式的实现逻辑和流程理清楚,然后编写代码. 1.2 以甜品店买奶茶为例.第一步:得先有服务员:第二步:我们提交一个奶茶订单 ...
- Java Future接口、Future模式理解
原文地址:https://blog.csdn.net/devinteng/article/details/23455733 Future接口介绍: 在Java中,如果需要设定代码执行的最长时间,即超时 ...
- 多线程基础之设计模式Future模式
一. Future模式介绍 前面的 Thread-Per-Message 模式将耗时时间的处理交给其他线程, 的确可以提高程序的响应性, 但是在将处理交出去的时候, 处理结果仍是未知的, 而等待处理结 ...
- [面试]future模式
Future模式 什么是future模式? 传统单线程环境下,调用函数是同步的,必须等待程序返回结果后,才可进行其他处理. Futrue模式下,调用方式改为异步. Futrue模式的核心在于:充分利用 ...
- Java是如何实现Future模式的?万字详解!
1 Future是什么? 先举个例子,我们平时网购买东西,下单后会生成一个订单号,然后商家会根据这个订单号发货,发货后又有一个快递单号,然后快递公司就会根据这个快递单号将网购东西快递给我们.在这一过程 ...
- 【并发编程】Future模式及JDK中的实现
本文讲解Java中Future模式的使用,文章也发布在了公号(点击查看),欢迎交流. 1.1.Future模式是什么 先简单举个例子介绍,当我们平时写一个函数,函数里的语句一行行同步执行,如果某一行执 ...
- 线程技术 ☞ Future模式
线程技术可以让我们的程序同时做多件事情,线程的工作模式有很多,常见的一种模式就是处理网站的并发,今天我来说说线程另一种很常见的模式,这个模式和前端里的ajax类似:浏览器一个主线程执行javascri ...
- java 回调模式_总结!!!总结!!!java回调以及future模式
总是忘记,我这里直接写实际的东西,看其他的博客都是类图,文字描述,这里直接用代码描述. 疑问:什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之 ...
最新文章
- shell的各种运行模式?
- 接口测试用例设计思路_用了Swagger2后,接口设计文档,测试用例都不用自己写了,爽...
- python需要音语基础_英语基础一般,如何才能学习C语言编程和Python
- mysql+index组合索引_MySQL 优化之 index merge(索引合并)
- virtualbox安装centos 6之增强工具
- C语言——球体体积判断素数用递归计算Fibonacci数列
- 在Spring MVC Web应用程序中添加社交登录:集成测试
- 红黑树实现——STL中的map
- ssh 介绍 和使用 程序不挂起
- Hibernate注释大全
- Java中有关日期的操作,昨天晚上赴约,搞到12点多才回来,今天写这一小段代码都花了一段漫长的时间,哎。。...
- 深度学习——夏侯南溪的深度神经网络的调参日志
- 如何防止远程程序与RDS PG连接中断
- ESXi 5.1 安装 Mac OSX Lion 10.7
- 如何下载网页中的小视频
- win10下SVN图标不显示
- PID原理(图形并茂)
- 擅长To C的腾讯,如何借腾讯云在这几个行业云市场占有率第一? ...
- 如何读取STL文件?
- redis数据结构hash
热门文章
- android7.0苹果x,谈谈新入手的一加7 Pro,它取代iPhone X成为了我的主力机
- RAGE的megatexture介绍
- DNF外i挂云霄见血
- OBS采集黑屏问题解决
- Laravel路由中不固定数量的参数如何实现?
- 我和chatGPT智能AI探讨人性话题,她居然说自己是一个人类!?
- 解决重新启动电脑打印机自动打印上一次打印作业的方法
- 我的世界java正版号ID_我的世界Java版帐号将迁移至微软帐号和相关注意事项FQA...
- 计算机毕业设计ssm+vue基本微信小程序的奶茶点单系统
- go语言抖音demo