异步编程之Future和Promise

最近在拾遗JS基础,看到Promise,总觉得和Java中的Future有联系,放在一块对比总结一下,加深记忆。

异步编程

异步编程是为了提高效率。其实这是一种在工作、生活都中非常常见的策略。
比如,我们跟别人交待任务,拜托别人完成了通知我们,这就是一种异步。我们不需要等到别人完成了再继续我们自己的工作,而只要等待别人的通知即可。我们和别人可以并行的做事。

既然是并行,那就需要至少两个干活的人,在计算机里面通常意味着多线程,问题来了JS是单线程的,那是怎么做到的呢?
答案是:虽然JS运行在浏览器中,是单线程的,但浏览器不是单线程的。浏览器中很多异步行为都是由浏览器新开一个线程去完成。javascript引擎线程是浏览器多个线程中的一个,它本身是单线程的。浏览器还包括很多其他线程,如界面渲染线程,浏览器事件触发线程,Http请求线程等。所以,所谓的javascript是单线程的,是指javascript运行在浏览器中是单线程的,叫做javascript引擎线程。

顺带提一下同步异步和阻塞、非阻塞的区别。这也是一个老生常谈的问题:
同步/异步是从行为角度描述事物的,而阻塞和非阻塞描述的当前事物的状态(等待调用结果时的状态)。
具体可以看这个:『怎样理解阻塞非阻塞与同步异步的区别?』

Future

好了下面说一下future。这个是是java的concurrent并发包里面的提供的类,他和Callable类常常一块使用。Future 表示异步计算的结果。其用于获取线程池执行callable后的结果,这个结果封装为Future类。

值得一提的是,由于Future类获取返回结果的get方法是阻塞的,jdk1.8中加入completableFuture使得Future可以注册监听器从而实现类似JS中的callback功能。这也是异步编程的推荐方式:回调。

Promise

回调是一种我们推崇的异步调用方式,但也会遇到问题,也就是回调的嵌套。当需要多个异步回调一起书写时,就会出现下面的代码 (以 js 为例):

asyncFunc1(opt, (...args1) => { 
  asyncFunc2(opt, (...args2) => {       
    asyncFunc3(opt, (...args3) => {            
      asyncFunc4(opt, (...args4) => {
          // some operation
      });
    });
  });
});

这样的代码不易读,嵌套太深修改也麻烦。于是 ES6 提出了 Promise 模式来解决回调地狱的问题。
Promise 是一个 ECMAScript 6 提供的类,目的是更加优雅地书写复杂的异步任务。

new Promise(function (resolve, reject) {
    console.log(1111);
    resolve(2222);
}).then(function (value) {
    console.log(value);
    return 3333;
}).then(function (value) {
    console.log(value);
    throw "An error";
}).catch(function (err) {
    console.log(err);
});

Future和Promise的区别

通常,Future 和 Promise 两个名词在这个并发模型里是混用的,无论是 Future 还是 Promise 都指代一个用于取得计算结果的代理或者计算结果的容器。不同之处是Future代表一个只读的还不存在的结果的容器。而Promise是一次性可写的。但Promise也实现了Future的接口。

Java 1.8 版本引入了 CompletableFuture 对象,这个对象实现的 CompletionStage 接口定义了一系列的流畅的编程接口以支持灵活扩展异步计算。此外,CompletableFuture 支持手动设定计算的结果,这就实现了 Promise 写入的语义。此前,我们只能通过立即返回的 Callable 来绕过。总的来说,CompletableFuture 是一个 Future 和 Promise 语义兼具的重载对象。

参考

https://www.zhihu.com/question/31982417/answer/54136684
https://www.cnkirito.moe/future-and-promise/
https://stackoverflow.com/questions/14541975/whats-the-difference-between-a-future-and-a-promise#:~:text=Futures%20and%20promises%20are%20pretty,written%20(normally%20only%20once).&text=The%20result%20of%20the%20future,result%20of%20an%20asynchronous%20computation.
https://zhuanlan.zhihu.com/p/71824799

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352