Kotlin协程作用域与Job详解
Job详解:
在上一次https://www.cnblogs.com/webor2006/p/11725866.html中抛出了一个问题:

所以咱们将delay去掉,需要改造一下,先把主线程的delay给注释掉:

那怎么做呢?这里先来看一下GlobalScope.launch()方法的返回值:

咱们先来回顾一下之前Job的理论描述:

简单看一下官方的对它的说明:

其它的就暂且不读了,那能拿到Job是不是可以通过它来达到我们精准等待协程执行完的目的呢?所以首先咱们来获取它的返回值:

那重点就是怎么通过这个Job来达到我们的目的了, 其实它里面有一个跟咱们线程中一样的join()方法,不过实现肯定不同啦,瞅瞅:

所以咱们试试:

下面来运行一下看效果:

确实是如此,这次“Kotlin Coroutines”和"World"几乎是同时间输出了。
协程作用域:
先来回顾一下咱们之前的代码:

也就是我们用GlobalScope.lauch()构造的协程中的代码是依附于主线程,如果主线程退出了,其协程也退出了,但是!!看下面这个代码就会颠覆这个效果了,如下:

运行:

发现此时“hello”在输出之后,还在等待后台协程在“Kotlin Coroutines”输出完之后再退出,这是为啥呢?这里就涉及到了“协程作用域”的概念好,下面先来看下理论:
“每一个协程构建器(包括runBlocking)都会向其代码块作用域中添加一个CoroutineScope实例,我们可以在该作用域中启动协程,而无需显示将其join到一起,这是因为外部协程(在上面的示例中就是runBlocking)会等待该作用域中的所有启动的协程全部完成后才会完成。”
也就是说:

而回到之前的这段代码:

而如果不用GlobalScope,而直接调用launch,它其实创建的是Scope就是runBlocking所创建的CoroutineScope实例了,此时外部的协程就会等待里面的协程了,还是比较难理解的,所以我们就可以利用这个特性来比较巧妙的来达到文章开头想要实现的那个效果。
Kotlin协程作用域与Job详解的更多相关文章
- Kotlin协程作用域与构建器详解
		
在上次我们是通过了这种方式来创建了一个协程: 接着再来看另一种创建协程的方式: 下面用它来实现上一次程序一样的效果,先来回顾一下上一次程序的代码: 好,下面改用runBlocking的方式: 运行一下 ...
 - libco协程库上下文切换原理详解
		
缘起 libco 协程库在单个线程中实现了多个协程的创建和切换.按照我们通常的编程思路,单个线程中的程序执行流程通常是顺序的,调用函数同样也是 “调用——返回”,每次都是从函数的入口处开始执行.而li ...
 - Kotlin协程基础
		
开发环境 IntelliJ IDEA 2021.2.2 (Community Edition) Kotlin: 212-1.5.10-release-IJ5284.40 我们已经通过第一个例子学会了启 ...
 - Android Kotlin协程入门
		
Android官方推荐使用协程来处理异步问题.以下是协程的特点: 轻量:单个线程上可运行多个协程.协程支持挂起,不会使正在运行协程的线程阻塞.挂起比阻塞节省内存,且支持多个并行操作. 内存泄漏更少:使 ...
 - Kotlin 协程一 —— 全面了解 Kotlin 协程
		
一.协程的一些前置知识 1.1 进程和线程 1.1.1基本定义 1.1.2为什么要有线程 1.1.3 进程与线程的区别 1.2 协作式与抢占式 1.2.1 协作式 1.2.2 抢占式 1.3 协程 二 ...
 - Kotlin协程解析系列(上):协程调度与挂起
		
vivo 互联网客户端团队- Ruan Wen 本文是Kotlin协程解析系列文章的开篇,主要介绍Kotlin协程的创建.协程调度与协程挂起相关的内容 一.协程引入 Kotlin 中引入 Corout ...
 - “全栈2019”Java第一百零一章:局部内部类覆盖作用域内成员详解
		
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
 - Kotlin协程第一个示例剖析及Kotlin线程使用技巧
		
Kotlin协程第一个示例剖析: 上一次https://www.cnblogs.com/webor2006/p/11712521.html已经对Kotlin中的协程有了理论化的了解了,这次则用代码来直 ...
 - Retrofit使用Kotlin协程发送请求
		
Retrofit2.6开始增加了对Kotlin协程的支持,可以通过suspend函数进行异步调用.本文简单介绍一下Retrofit中协程的使用 导入依赖 app的build文件中加入: impleme ...
 
随机推荐
- Git 配置环境
			
安装 在Fedora/CentOS下安装 $ sudo yum install git 在Debian/Ubuntu Linux下载安装 $ sudo apt-get install git Wind ...
 - phpstorm打开报错方法
			
phpstorm打开报错方法 直接删掉默认文件夹里的idea文件夹 重新打开就可以了
 - 解决 niceScroll  自适应DOM 高度变化
			
利用dataTable展示数据列表时,当选择每页显示数量时,滚动条还是按照页面初始化时显示的,导致无法滚动查看下面的数据, 在stackoverflower 找到一个可用的方法,但不知道为什么仅写 ...
 - DRF框架(七) ——三大认证组件之频率组件、jwt认证
			
drf频率组件源码 1.APIView的dispatch方法的 self.initial(request,*args,**kwargs) 点进去 2.self.check_throttles(re ...
 - 异常处理和UDP Socket套接字
			
一.异常处理 1.什么是异常处理: 程序在运行过程中出现了不可预知的错误,并且该错误没有对应的处理机制,那么就会以异常的形式表达出来,造成的影响就是整个程序无法再正常进行. 2.异常的结构: 1.异常 ...
 - 【题解】Luogu P5405 [CTS2019]氪金手游
			
原题传送门 我们珂以先考虑一条链的情况,设\(sum\)为所有\(w_i\)的总和,\(Sw_i\)表示\(\sum_{j=i}^nw_i\) \[1 \rightarrow 2 \rightarro ...
 - C# 获取特殊日期
			
//1.当前时间DateTime dt = DateTime.Now; //2.本周周一DateTime startWeek = dt.AddDays(1 - Convert.ToInt32(dt.D ...
 - 【1】TOPK最小的K个数(多种方法比较)
			
(头条) 最小的第K个数也是和这题topK一样的思路 1.全排序 时间复杂度O(nlogn) 2.Partiton思想 时间复杂度O(n) (因为不需要像快排一样对所有的分段都两两Partitio ...
 - ELK学习笔记之Logstash不停机自动重载配置文件
			
0x00 自动重新加载配置 为了可以自动检测配置文件的变动和自动重新加载配置文件,需要在启动的时候使用以下命令: ./bin/lagstash -f configfile.conf --config. ...
 - C# vb .net实现透明特效滤镜
			
在.net中,如何简单快捷地实现Photoshop滤镜组中的透明效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...