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详解的更多相关文章

  1. Kotlin协程作用域与构建器详解

    在上次我们是通过了这种方式来创建了一个协程: 接着再来看另一种创建协程的方式: 下面用它来实现上一次程序一样的效果,先来回顾一下上一次程序的代码: 好,下面改用runBlocking的方式: 运行一下 ...

  2. libco协程库上下文切换原理详解

    缘起 libco 协程库在单个线程中实现了多个协程的创建和切换.按照我们通常的编程思路,单个线程中的程序执行流程通常是顺序的,调用函数同样也是 “调用——返回”,每次都是从函数的入口处开始执行.而li ...

  3. Kotlin协程基础

    开发环境 IntelliJ IDEA 2021.2.2 (Community Edition) Kotlin: 212-1.5.10-release-IJ5284.40 我们已经通过第一个例子学会了启 ...

  4. Android Kotlin协程入门

    Android官方推荐使用协程来处理异步问题.以下是协程的特点: 轻量:单个线程上可运行多个协程.协程支持挂起,不会使正在运行协程的线程阻塞.挂起比阻塞节省内存,且支持多个并行操作. 内存泄漏更少:使 ...

  5. Kotlin 协程一 —— 全面了解 Kotlin 协程

    一.协程的一些前置知识 1.1 进程和线程 1.1.1基本定义 1.1.2为什么要有线程 1.1.3 进程与线程的区别 1.2 协作式与抢占式 1.2.1 协作式 1.2.2 抢占式 1.3 协程 二 ...

  6. Kotlin协程解析系列(上):协程调度与挂起

    vivo 互联网客户端团队- Ruan Wen 本文是Kotlin协程解析系列文章的开篇,主要介绍Kotlin协程的创建.协程调度与协程挂起相关的内容 一.协程引入 Kotlin 中引入 Corout ...

  7. “全栈2019”Java第一百零一章:局部内部类覆盖作用域内成员详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. Kotlin协程第一个示例剖析及Kotlin线程使用技巧

    Kotlin协程第一个示例剖析: 上一次https://www.cnblogs.com/webor2006/p/11712521.html已经对Kotlin中的协程有了理论化的了解了,这次则用代码来直 ...

  9. Retrofit使用Kotlin协程发送请求

    Retrofit2.6开始增加了对Kotlin协程的支持,可以通过suspend函数进行异步调用.本文简单介绍一下Retrofit中协程的使用 导入依赖 app的build文件中加入: impleme ...

随机推荐

  1. [转]java 根据模板文件生成word文档

    链接地址:https://blog.csdn.net/ai_0922/article/details/82773466

  2. [Sw] Swoole 生态迷局,基于 Swoole 的第 109 框架

    这两天,又一全栈式 Swoole 协程框架面世了 - hyperf,实现思路是我内心点了赞同的,就集成现有 PHP 生态优质组件到 Swoole 的协程中来. 有人想到,为什么不是 Swoole 集成 ...

  3. 搜索排序的评价指标NDCG

    refer: https://www.cnblogs.com/by-dream/p/9403984.html Out1 = SELECT QueryId, DocId, Rating, ROW_NUM ...

  4. jQuery正则校验

    jQuery正则校验 银行卡号 //验证银行卡号,bankno为银行卡号function luhnCheck(){ var bankno = $.trim($("#bankNoInp&quo ...

  5. Mysql 语句 insert into 与 replace into 区别

    []insert into 与 replace into 区别 replace into 的运行与insert into 很相似.不同点: 若表中的一个旧记录与一个用于PRIMARY KEY 或 一个 ...

  6. Label&Button

    Button中的bg参数设置按钮背景颜色,fg参数设置字体颜色 pack中的fill参数告诉Packer让QUIT按钮占据剩余的水平空间,而expand参数则引导它填充整个水平可视空间,将按钮拉伸到左 ...

  7. RT1052 BootLoader总结

    RT1052 BootLoader总结‍ 概述 Bootloader涉及到的RT1052单片机资源有:Cache,ram,外部SDRAM,ARM7汇编指令,外部dataFlash. 升级功能涉及到的其 ...

  8. CentOS7搭建jenkins

    一.概述 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. 安装环境 操作系统:centos ...

  9. 解决使用RabbitTemplate操作RabbitMQ,发生The channelMax limit is reached. Try later.问题

    使用RabbitTemplate操纵RabbitMQ,每个RabbitTemplate等于一个connection,每个connection最多支持2048个channel,当hannel达到2048 ...

  10. zcmu 1540第k大数

    1540: 第k大数Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Web Board]Description有两个序列a,b,它们的 ...