闲谈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("买花去喽");
//dosomething
System.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("买花去喽");
//dosomething
System.out.println("蛋糕的名字:"+cake.get().getName());
}
三、 使用场景
一个请求要获取地图的图片,以及一些位置信息,由于地图图片的生成比较费时,那么我们利用Future模式,让一个生成地图的线程慢慢生成图片,而获取位置信息也可以同时进行,不必等到图片生成完了再去获取位置信息。
Future模式解决的问题是让本来顺序执行的事情,变成可以同时执行。
闲谈Future模式-订蛋糕的更多相关文章
- 线程笔记:Future模式
线程技术可以让我们的程序同时做多件事情,线程的工作模式有很多,常见的一种模式就是处理网站的并发,今天我来说说线程另一种很常见的模式,这个模式和前端里的ajax类似:浏览器一个主线程执行javascri ...
- 架构师养成记--9.future模式讲解
什么是future模式呢?解释这个概念之前我们先来了解一个场景吧,财务系统的结账功能,这个功能可能是每个月用一次,在这一个月中相关的数据量已经积累得非常大,这一个功能需要调用好几个存储过程来完成.假如 ...
- Future模式
Future模式简介 Future模式有点类似于网上购物,在你购买商品,订单生效之后,你可以去做自己的事情,等待商家通过快递给你送货上门.Future模式就是,当某一程序提交请求,期望得到一个答复.但 ...
- 线程技术 ☞ Future模式
线程技术可以让我们的程序同时做多件事情,线程的工作模式有很多,常见的一种模式就是处理网站的并发,今天我来说说线程另一种很常见的模式,这个模式和前端里的ajax类似:浏览器一个主线程执行javascri ...
- java Future 模式
考慮這樣一個情況,使用者可能快速翻頁瀏覽文件中,而圖片檔案很大,如此在瀏覽到有圖片的頁數時,就會導致圖片的載入,因而造成使用者瀏覽文件時會有停頓 的現象,所以我們希望在文件開啟之後,仍有一個背景作業持 ...
- Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- 多线程之Future模式
详细参见葛一名老师的<Java程序性能优化> Futrue模式:对于多线程,如果线程A要等待线程B的结果,那么线程A没必要等待B,直到B有结果,可以先拿到一个未来的Future,等B有结果 ...
- java Future模式
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- 14.Java中的Future模式
jdk1.7.0_79 本文实际上是对上文<13.ThreadPoolExecutor线程池之submit方法>的一个延续或者一个补充.在上文中提到的submit方法里出现了Future ...
随机推荐
- Combiner
如果job 设置了 combiner ,则job的每个map运行的数据会先进入combiner,然后再通过patitioner分发到reduce.通过combiner能减少reduce的计算.空间压力 ...
- Python得到前面12个月的数据,Python得到现在时间 前一年的数据,
#Python 实现得到现在时间12个月前的每个月 # 假设现在的时间是2016年9月25日 #得到现在的时间 得到now等于2016年9月25日 now = datetime.datetime.no ...
- SQLServer2008 行转列2
with a as ( select numb,name,row_number() over( partition by numb order by name desc) rowid from fen ...
- Linux Java 环境变量设置
对整个机器:所有用户 1,在/etc/profile 文件末尾加入 export JAVA_HOME=/var/opt/jdk1.7.0_04 export PATH=$JAVA_HOME/bin:$ ...
- Html 修改placeholder的颜色属性css样式
项目需求需要修改文本框的placeholder 的文本颜色, 百度下, 备忘,我使用的是这种方法, ::-webkit-input-placeholder { /* WebKit browsers * ...
- dotfuscator初步
从此链接下载的http://www.uzzf.com/soft/85836.html 1.安装之前,先去控制面板将VS自带的dotfuscator卸载掉 2.关闭360安全卫士 3.安装下载的程序 安 ...
- SQL多表联合分页.....
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go /* 支持多表查询分页存储过程(事理改进)2012.3 --多表联查1 declare @Count int ...
- 什么是PHP Guzzle?
Guzzle是一个使得利用PHP实现发送HTTP 请求,方便和web service集成的PHP 客户端模拟组件.一句话,它就像一个PHP写的浏览器.当你的服务端程序需要作为客户端来访问其他的serv ...
- Qt之密码框不可选中、复制、粘贴、无右键菜单等
简述 在做用户登录.修改密码的时候,往往会用到密码框,其中一些功能要求与普通的输入框不同,例如:不能选中.复制.粘贴.无右键菜单等功能,当然设置密码不可见是必须的! 下面介绍两种方式来实现相同的效果. ...
- short s1 = 1; s1 = s1 + 1;和 s1 += 1;
对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误. 对于shor ...