一、 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模式-订蛋糕相关推荐

  1. 从理解Future模式到仿写JUC的Future模式

    1.Future模式 过生日,在线上定蛋糕的例子可以形象的解释Future模式. 两个步骤: 1.下单 - 委托制作蛋糕:你在线定下单订蛋糕,将制作蛋糕的工作委托给了蛋糕店. 2.取蛋糕:凭着在线支付 ...

  2. 设计模式之Future模式——提交任务后立即得到一个Future对象,后面利用该对象得到具体的执行结果。加上回调功能,任务执行结束通知调用者或直接回调相应方法

    1. Future模式的实现逻辑 1.1 在具体实现之前,我们先将Future模式的实现逻辑和流程理清楚,然后编写代码. 1.2 以甜品店买奶茶为例.第一步:得先有服务员:第二步:我们提交一个奶茶订单 ...

  3. Java Future接口、Future模式理解

    原文地址:https://blog.csdn.net/devinteng/article/details/23455733 Future接口介绍: 在Java中,如果需要设定代码执行的最长时间,即超时 ...

  4. 多线程基础之设计模式Future模式

    一. Future模式介绍 前面的 Thread-Per-Message 模式将耗时时间的处理交给其他线程, 的确可以提高程序的响应性, 但是在将处理交出去的时候, 处理结果仍是未知的, 而等待处理结 ...

  5. [面试]future模式

    Future模式 什么是future模式? 传统单线程环境下,调用函数是同步的,必须等待程序返回结果后,才可进行其他处理. Futrue模式下,调用方式改为异步. Futrue模式的核心在于:充分利用 ...

  6. Java是如何实现Future模式的?万字详解!

    1 Future是什么? 先举个例子,我们平时网购买东西,下单后会生成一个订单号,然后商家会根据这个订单号发货,发货后又有一个快递单号,然后快递公司就会根据这个快递单号将网购东西快递给我们.在这一过程 ...

  7. 【并发编程】Future模式及JDK中的实现

    本文讲解Java中Future模式的使用,文章也发布在了公号(点击查看),欢迎交流. 1.1.Future模式是什么 先简单举个例子介绍,当我们平时写一个函数,函数里的语句一行行同步执行,如果某一行执 ...

  8. 线程技术 ☞ Future模式

    线程技术可以让我们的程序同时做多件事情,线程的工作模式有很多,常见的一种模式就是处理网站的并发,今天我来说说线程另一种很常见的模式,这个模式和前端里的ajax类似:浏览器一个主线程执行javascri ...

  9. java 回调模式_总结!!!总结!!!java回调以及future模式

    总是忘记,我这里直接写实际的东西,看其他的博客都是类图,文字描述,这里直接用代码描述. 疑问:什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之 ...

最新文章

  1. shell的各种运行模式?
  2. 接口测试用例设计思路_用了Swagger2后,接口设计文档,测试用例都不用自己写了,爽...
  3. python需要音语基础_英语基础一般,如何才能学习C语言编程和Python
  4. mysql+index组合索引_MySQL 优化之 index merge(索引合并)
  5. virtualbox安装centos 6之增强工具
  6. C语言——球体体积判断素数用递归计算Fibonacci数列
  7. 在Spring MVC Web应用程序中添加社交登录:集成测试
  8. 红黑树实现——STL中的map
  9. ssh 介绍 和使用 程序不挂起
  10. Hibernate注释大全
  11. Java中有关日期的操作,昨天晚上赴约,搞到12点多才回来,今天写这一小段代码都花了一段漫长的时间,哎。。...
  12. 深度学习——夏侯南溪的深度神经网络的调参日志
  13. 如何防止远程程序与RDS PG连接中断
  14. ESXi 5.1 安装 Mac OSX Lion 10.7
  15. 如何下载网页中的小视频
  16. win10下SVN图标不显示
  17. PID原理(图形并茂)
  18. 擅长To C的腾讯,如何借腾讯云在这几个行业云市场占有率第一? ...
  19. 如何读取STL文件?
  20. redis数据结构hash

热门文章

  1. android7.0苹果x,谈谈新入手的一加7 Pro,它取代iPhone X成为了我的主力机
  2. RAGE的megatexture介绍
  3. DNF外i挂云霄见血
  4. OBS采集黑屏问题解决
  5. Laravel路由中不固定数量的参数如何实现?
  6. 我和chatGPT智能AI探讨人性话题,她居然说自己是一个人类!?
  7. 解决重新启动电脑打印机自动打印上一次打印作业的方法
  8. 我的世界java正版号ID_我的世界Java版帐号将迁移至微软帐号和相关注意事项FQA...
  9. 计算机毕业设计ssm+vue基本微信小程序的奶茶点单系统
  10. go语言抖音demo