kotlin协程[7]:深层揭示runBlocking与coroutineScope之间的异同

在之前写过这样的一个例子,先来回顾一下:


也就是来演示runBlockingcoroutineScope之间的异同点,当时还阐述了一个对它的理论描述,也来回顾一下:

这里再开个篇幅来提出的原因是在于。。这里面有一些深层次的东东需要再次挖掘,而问题的焦点是在:


回到代码根据这段文字的理解照理应该是这样的嘛:

结果肯定不是我们现在所质疑的观点啦,所以这也是需要再单独拎出来值得探讨的东东,这是因为关于runBlockingcoroutineScope是有更加深层的原因的,下面先来阐述一下:

1. runBlocking并非挂起函数;也就是说,调用它的线程会一直位于该函数中,直到协程执行完毕为止。
2. coroutineScope是挂起函数;也就是说,如果其中的协程挂起,那么coroutineScope函数也会挂起。这样,创建coroutineScope的外层函数就可以继续在同一个线程中执行了,该线程会【逃离】coroutineScope之外,并且可以做其他一些事情。

咱们来看一下runBlocking函数的定义:

再来看一下coroutineScope函数的定义:

说实话对于上面的理论描述有点难以理解,怎么最终的welcome的输出是在最后打印的而非咱们预期理解的要立马打印出来,其实需要这样来理解:

所以很明显“welcome”肯定是最后才会被打印出来的,但是!!!貌似上面的有点像是coroutineScope函数阻塞了当前线程,这个观点又与这个理论貌似矛盾了呀:

其实这个理论是没任何问题的,就是理解上需要这样来理解,如下:


如果说coroutineScope是阻塞了当前线程,也就不可能能执行到这句代码:

所以这也能论证coroutineScope确实是不会阻塞当前线程的,而当跳出到runBlocing代码时,它里面会有一个事件循环:


当事件发生时则就会触发事件,也就类似于当休眠完之后就要开始打印语句了,也就相当于事件触发了,如下:

这也就是这句话能打印出来的原因,也就是说,其coroutinScope的真正流程是它会将调度返回给外层runBlocking里面的代码,而且是coroutineScope之上的代码,而非之下的代码,而welcome为啥是最后才打印的真正原因绝对不是因为coroutinScope将线程的代码给阻塞了,这一点确实是比较难理解!!

好,下面了解了这些深层次的理论之后,咱们再以更加正确的姿势来解读一下整个程序的执行流程:

接下来线程就会碰到coroutineScope挂起函数了:

当遇到挂起函数时,就需要立马来区分它之上的代码和之下的代码,记住一点:它之下的代码一定是需要等待coroutineScope中的协程代码整个执行完了才能被执行到【如果这个前提观点不知道,那整个流程就确实是比较难解释了,一定得要有这种概念】,而:

另外一点是当线程遇到了挂起函数会立马从它往上返回,也就是返回到这块代码:



接下来由于延时到了,接着coroutineScope中的这段代码会得到执行:

接着10s过后,里面的协程这块代码就会被打印了:

当这个打印完成,则整个coroutineScope中的协程都执行完了,那该挂起函数也就可以退出了,最后就可以执行挂起函数之下的代码,也就是:

至此!!整个流程就再次以一个全新的视角分析完了~~ 虽说是比较细节,但是对于整个协程的认知理解是非常之重要的!!

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

推荐阅读更多精彩内容