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 ...
随机推荐
- 好用的npm包或者工具
1.样式 classnames:https://github.com/JedWatson/classnames 2.随机数 uuid:https://github.com/kelektiv/node- ...
- Centos7.3之K8S安装初体验
容器是发展趋势,所以是时候从虚拟机中脱离出来,投入到容器化的怀抱中了. 曾经试过安装k8s,都没有成功,各种乱七八糟的报错,于是一拖再拖,这次总算发现一个可以快速部署的工具,终于安装成功了. 这个k8 ...
- hive 引入第三方包(不重启)
Jar放入${HIVE_HOME}/auxlib目录 在${HIVE_HOME}中创建文件夹auxlib,然后将自定义jar文件放入该文件夹中. 此方法添加不需要重启Hive.而且比较便捷. 连接方式 ...
- 前端传实体数组;后台list实体接收参数
前端页面: $.ajax({ url: url, data: JSON.stringify(data), dataType: "json", contentType: " ...
- 一段隐藏文字的css代码,记录下
<span style="width:1px; height:1px; color:#fff; outline-width:hidden; overflow:hidden; displ ...
- 初识Java及所要准备的工作
整个Java学习路线 Java特点: 开源:源代码开放 跨平台:由于各平台有差异型,java由JVM对源代码进行解释执行,一次编译到处运行 Java的学习框架如下: JavaSE包括: 数据库包括: ...
- Java打开GC日志
环境: JDK1.8 打开GC日志: -verbose:gc 这个只会显示总的GC堆的变化, 如下: [GC (Allocation Failure) 80832K->19298K(2278 ...
- window 关机
schtasks /create /tn "关机" /tr "shutdown /s" /sc once /st 20:30
- Feign调用时读取超时(Read timed out executing GET)解决
解决方式(很多人比较关注,所以放在最前面): 因为Feign调用默认的超时时间为一分钟,一分钟接口不能返回就会抛出异常,所以在服务端的yml文件中增加如下配置即可解决: # feign调用超时时间配置 ...
- HTML5+规范:Geolocation(管理设备位置信息) 定位
Geolocation模块管理设备位置信息,用于获取地理位置信息,如经度.纬度等.通过plus.geolocation可获取设备位置管理对象.虽然W3C已经提供标准API获取位置信息,但在某些平台存在 ...