深层次揭示runBlocking与coroutineScope之间的异同点
在之前https://www.cnblogs.com/webor2006/p/11731763.html咱们写过这样的一个例子,先来回顾一下:

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

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

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

结果肯定不是我们现在所质疑的观点啦,所以这也是需要再单独拎出来值得探讨的东东,这是因为关于runBlocking和coroutineScope是有更加深层的原因的,下面先来阐述一下:
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中的协程都执行完了,那该挂起函数也就可以退出了,最后就可以执行挂起函数之下的代码,也就是:

所以:

至此!!整个流程就再次以一个全新的视角分析完了~~ 虽说是比较细节,但是对于整个协程的认知理解是非常之重要的!!
深层次揭示runBlocking与coroutineScope之间的异同点的更多相关文章
- jquery插件模式开发和react组件开发之间的异同
jquery插件模式开发和react组件开发之间的异同
- 关于commonjs,AMD,CMD之间的异同
1.简介 随着前端业务复杂度的增加,模块化成为一个大的趋势.而在ES6还未被浏览器所支持的情况下,commonjs作为ES6中标准模块加载方案,在客服端中的支持情况并不好,现在在客服端中有2中模块化的 ...
- WCF与WebService之间的异同
下面我们来详细讨论一下二者的区别.Web Service和WCF的到底有什么区别. 1,Web Service:严格来说是行业标准,也就是Web Service 规范,也称作WS-*规范,既不是框架, ...
- 【转】深层次探讨mutex与semaphore之间的区别(下)
原文网址:http://blog.chinaunix.net/uid-23769728-id-3173282.html 这篇博文很长,虽然这是下篇,但还没结束,benchmark方面的东西正在进行中, ...
- 图像分类中max-pooling和average-pooling之间的异同
池化操作时在卷积神经网络中经常采用过的一个基本操作,一般在卷积层后面都会接一个池化操作,但是近些年比较主流的ImageNet上的分类算法模型都是使用的max-pooling,很少使用average-p ...
- 浅谈java中接口与抽象类之间的异同
刚学习java的时候,总觉得接口和抽象类很像,但又说不上具体有什么区别.今天静下来,翻翻书,查查资料,做个小结.首先举两个例子,看看interface和abstract class 在“外形”上有啥异 ...
- 【精】cookie、 sessionStorage 、localStorage之间的异同
1.cookie:存储在用户本地终端上的数据.有时也用cookies,指某些网站为了辨别用户身份,进行session跟踪而存储在本地终端上的数据,通常经过加密.一般应用最典型的案列就是判断注册用户是否 ...
- java中抽象类和接口之间的异同点
抽象类 接口 声明方式 abstratc class ClassName interface ClassName 包含内容 构造方法,普通方法,抽象方法.static方法 .变量常量 全局常量.抽 ...
- static变量、static方法之间的异同
private SchemeBean getEmptyScheme() { SchemeBean scheme = new SchemeBean(); scheme ...
随机推荐
- Centos7安装部署MongoDB教程
安装方式: RPM包安装 安装步骤: 一.下载RPM包 下图是需要注意的事项.其一选择MongoDB的社区版本,默认是企业版本.其二,选中版本后,在下方会出现下载地址,直接复制下载即可 二.安装并查 ...
- Python的编码规范
7. 什么是 PEP8? 8号Python增强提案,是针对Python代码格式而编写的风格指南 8. 了解 Python 之禅么? 通过 import this 语句可以获取其具体的内容.它告诉大家何 ...
- Oracle Spatial分区应用研究之五:不同分区粒度+本地空间索引效率对比
1.实验目的 若使用本地空间索引,不同分区粒度将产生不同索引组织,其索引分区个数.大小.R-TREE树结构均不相同.那么,在什么分区粒度下的本地空间索引效率较高呢? 2实验数据 实验数据为全国2531 ...
- Python Tkinter的学习
Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以在大多数的Unix平台下使用,同样可以应用在Windows和Macinto ...
- 移动APP接口安全性设计
移动APP接口是怎么保证安全性的,可以采用https,或者是非对称加密. 接口加密的目的是防止被别人用抓包工具,抓包后篡改数据. 关于加密算法常见的有对称加密(DES)和非对称加密(RSA) 对称加密 ...
- DBCP(MySql)+Servlet+BootStrap+Ajax实现用户登录与简单用户管理系统
目 录 简介 本次项目通过Maven编写 本文最后会附上代码 界面截图 登录界面 注册界面 登录成功进入主页 增加用户操作 删除用户操作 修改用户操作 主要代码 Dao层代码 DBCP代码 Se ...
- vue3 createComponent
这个函数不是必须的,除非你想要完美结合 TypeScript 提供的类型推断来进行项目的开发. 这个函数仅仅提供了类型推断,方便在结合 TypeScript 书写代码时,能为 setup() 中的 p ...
- 如何获取图片上传OSS后的缩略图 超简单
OSS是使用通过URL尾部的参数指定图片的缩放大小 图片路径后面拼接如下路径: ?x-oss-process=image/[处理类型],x_100,y_50[宽高等参数] ?x-oss-pro ...
- C# vb .net实现黑白效果特效滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的黑白效果效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...
- 2019 智联招聘java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.智联等公司offer,岗位是Java后端开发,因为发展原因最终选择去了智联,入职一年时间了,之前面试了很多家公 ...