RunBlocking CoroutineScope SupervisorScope Launch Async CoroutineStart协程启动模式 Job对象和生命周期

2023-11-06

协程的作用域构建器

  RunBlocking  

runBlocking是常规函数,会把当前主线程包装成一个主协程,其会阻塞当前线程, 只有当等待其主协程体以及里面的所有子协程执行结束以后,才会让当前线程执行,

  CoroutineScope 
coroutineScope是挂起函数,不会阻塞当前线程。
public actual fun <T> runBlocking(context: CoroutineContext, block: suspend CoroutineScope.() -> T): T {}


public suspend fun <R> coroutineScope(block: suspend CoroutineScope.() -> R): R {}
CoroutineScope与SupervisorScope的区别:
  coroutineScope  一个协程执行失败了,所有其他兄弟协程执行就会中断  (一毁俱毁)
  supervisorScope  一个协程执行失败了,不会影响其他兄弟协程的执行 (一毁不俱毁)
  private fun coroutineScopeTest() {
   //   coroutineScope  一个协程执行失败了,所有其他兄弟协程执行就会中断  (一毁俱毁)
     runBlocking {
         coroutineScope {
             launch {
                 delay(400)
                 LogUtil.e("job1 was executed.")
             }
             launch {
                 delay(200)
                 LogUtil.e("job2 was executed.")
                 throw IllegalArgumentException()
             }
         }
     }
     //只会输出  job2 was executed. 协程1 中断了 不会输出结果
    }

    private fun supervisorScopeTest() {
        //   supervisorScope  一个协程执行失败了,不会影响其他兄弟协程的执行 (一毁不俱毁)
        runBlocking {
            supervisorScope {
                launch {
                    delay(400)
                    LogUtil.e("job1 was executed.")
                }
                launch {
                    delay(200)
                    LogUtil.e("job2 was executed.")
                    throw IllegalArgumentException()
                }
            }
        }
        //会输出  job2 was executed.  job1 was executed.
    }
 

  Launch  

launch 返回一个Job类型,并且不附带任何结果值,没有返回结果值

如果你要在launch函数里执行逻辑,会执行里面的逻辑,但是没有任何返回结果值的(如果你想要有返回结果值 使用Async) 

public fun CoroutineScope.launch():Job

 返回Job类型有个join()函数,是个协程方法,不会阻塞线程。调用此函数意识是 要等当前调用此函数 的协程执行完逻辑后,才会执行其他的子协程

public interface Job : CoroutineContext.Element {
 public suspend fun join()
}

  Async

async返回Deferred类型(集成Job类型  ),(注意我们返回Deferred类型不是我们最总需要的返回结果值) 需要调用await()方法返回我们最终需要的结果值

public fun <T> CoroutineScope.async(): Deferred<T>

返回类型Deferred<T>有个await()函数,是个协程方法,不会阻塞线程。调用此函数意识是 要等当前调用此函数 的协程执行完逻辑后,才会执行其他的子协程,同时其还会返回该子协程执行的逻辑结果值

public interface Deferred<out T> : Job {
 public suspend fun await(): T
 }

  runBlocking {
             val job1: Job = launch {
                 delay(500)
                 LogUtil.e("job1 was executed.")  //执行了launch里的 逻辑: 输出 job1 was executed
                 "方明飞"
             }
                LogUtil.e(job1.toString() ) //没有返回结果值   StandaloneCoroutine{Active}@b57027
                job1.join() //什么意识了? 要等子协程job1执行完后,才会执行后面的子协程job2 job3


          val  job2 :Deferred<String> =async {
              delay(250)
               LogUtil.e("job2 was executed.") //执行了launch里的 逻辑: 输出 job2 was executed.
               val normalData12:NormalData  =get<NormalData>(named("userNameAge"))
                normalData12.userName
          }
              LogUtil.e("${job2.toString()}") //输出 DeferredCoroutine{Active}@a96d2d4
             val job2Result:String  =  job2.await()//什么意识了? 要等子协程job2执行完后,才会执行后面的子协程 job3
                 LogUtil.e(job2Result)//输出结果值  方明飞

         val  job3 :Deferred<Int> =async {
                 delay(100)
                 LogUtil.e("job3 was executed.") //执行了launch里的 逻辑: 输出 job3 was executed.
                 val normalData122:NormalData  =get<NormalData>(named("userNameAge"))
                   normalData122.age
             }
             job3.await()//什么意识了?要等子协程job3执行完后,才会执行主线程
             LogUtil.e("${job3.await()}")//输出结果值  34
             LogUtil.e("${job3.toString()}") //输出  DeferredCoroutine{Completed}@a6c8c7d
         }

 协程启动模式CoroutineStart

协程的启动模式是指定协程启动后的一些行为

 public enum class CoroutineStart {
         DEFAULT,
        LAZY,
        ATOMIC,
          UNDISPATCHED;
        
            }

DEFAULT    创建协程后,立即开始调度执行。 饿汉式启动  launch 调用后,会立即进入待调度状态。  在调度前如果协程被取消,其将直接进入取消状态。

LAZY         只有在需要的情况下运行。 是懒汉式启动 launch 后并不会有任何调度行为,协程体也自然不会进入执行状态,  直到我们需要它执行的时候。

            那什么时候我们需要它执行的时候呢?
             launch 调用后会返回一个 Job 实例,
              调用 job.start(),主动触发协程的调度执行,
              调用 job.join(),隐式的触发协程的调度执行

         asynic 调用后返回一个Deferred<out T>

          调用 Job.await(),才会开始执行调度.

ATOMIC     协程创建后,立即开始调度执行,但在开始运行之前无法取消

UNDISPATCHED  立即在当前线程执行协程体,直到第一个 suspend 调用

public fun CoroutineScope.launch(
    context: CoroutineContext = EmptyCoroutineContext,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    block: suspend CoroutineScope.() -> Unit
): Job {}
public fun <T> CoroutineScope.async(
    context: CoroutineContext = EmptyCoroutineContext,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    block: suspend CoroutineScope.() -> T

): Deferred<T> {}

Job对象和生命周期

对于每一个新创建的协程(通过launch或者async),会返回一个Job实例,该Job实例是协程的唯一标示,并且负责管理协程的生命周期。
Job的生命周期
一个协程任务可以包含一系列Job的生命周期状态:
新创建(New)、活跃(Active)、完成中(Completing)、已完成(Completed)、取消中(Cancelling)和已取消(Cancelled)。
虽然我们无法直接访问这些状态,但是我们可以访问Job的属性:isActive、isCancelled和isCompleted。

如果协程处于活跃状态,协程运行出错或者调用 job.cancel() 都会将当前任务置为取消中 (Cancelling) 状态 (isActive = false, isCancelled = true)。
当所有的子协程都完成后,协程会进入已取消 (Cancelled) 状态,此时 isCompleted = true

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RunBlocking CoroutineScope SupervisorScope Launch Async CoroutineStart协程启动模式 Job对象和生命周期 的相关文章

随机推荐

  • 使用HTML和CSS完成网页导航模块的制作步骤和方法

    小编本人从事IT培训教育行业多年 在教授学生网页设计课程的时候 尤其是到CSS部分的时候 学生总是很难理解 大部分学生上手慢 针对这个问题 小编本人在教学的时候 将网页设计分模块进行讲解 今天就来给大家分享一下如何使用HTML和CSS完成网
  • 时间序列预测——双向LSTM(Bi-LSTM)

    本文展示了使用双向LSTM Bi LSTM 进行时间序列预测的全过程 包含详细的注释 整个过程主要包括 数据导入 数据清洗 结构转化 建立Bi LSTM模型 训练模型 包括动态调整学习率和earlystopping的设置 预测 结果展示 误
  • ipcfg报错_编译出错信息解析

    1 SRC WEB WEBPOST C 599 warning C280 ipcfg unreferenced local variable 定义了 但是没有使用 就会有这个警告 一般来说 出现这种情况则表示可以删除警告中所指的变量 2 S
  • redis学习:BitMap

    使用位存储 信息状态只有 0 和 1 这个适合哪种记录某些状态只有两种状态的 比如说成绩及没及格 是男是女 不考虑跨性别的 上班迟没迟到 是或者不是这种 Bitmap是一串连续的2进制数字 0或1 每一位所在的位置为偏移 offset 在b
  • java.lang.IllegalStateException: Failed to convert message:‘‘ to outbound message.

    java lang IllegalStateException Failed to convert message GenericMessage payload 4a76a1ea 9bab 4305 a7f9 26b63e113a19 he
  • jmeter 聚合数据_性能测试连载 (37)性能测试数据错误率分析

    概述 性能测试脚本跑完了之后 我们除了要收集瓶颈数据 还有分析错误数据 通常一套脚本跑完 错误类型不止一种 但是jmeter只会在聚合报告里面给出一个总体的错误率 错误率 jmeter里的错误率是如何统计的 在返回的数据里面 只要succe
  • 2022上半年

    2022上半年 b a c b 找不同 a 串联公式 并联公式 c b d c 在本地安装的沙都软件和网页被篡改没有之间的联系 a 对于SNAT 是由内网去访问外网的时候进行的地址转换 d b c b c c d b c d b a
  • 实现微信小程序web-view内嵌H5中的下载功能(大文件切片下载)

    实现微信小程序内嵌H5中的下载功能 一 项目场景 难点 解决方案 1 H5微信小程序 a 首先必不可少的是安装jweixin module模块 b 在main js中将依赖绑定 c H5对应页面点击下载时代码为 2 uni app的小程序
  • python+selenium+unittest自动化测试

    python selenium unittest自动化测试详解 Base 基类层 最基础类 供其他文件调用 封装浏览器方法 以方便后面代码的调用 可以二次封装自带的方法 方便调用 其他地方调用基础类的方法 如果需要修改调用地方的方法 只需要
  • 为什么我们要用Spring?

    在之前的文章说说java反射 2 反射的价值我们对java反射的内容有了一定的了解 并且通过反射机制做了一个简单的框架 也算是对于Spring框架的铺垫 接下来了解一下我们使用Spring框架的意义 Spring是一个解决了许多在J2EE开
  • 始料未及的COVID-19、延期的考试、又可以瞎倒腾的喜悦

    Hmmm 真的本来下定决心不要东摸西摸专心功课 但是确实发生了本次人类历史上的大事件 当然可能在以后的日子里这个也就是洒洒水水平 导致了考试的延期 我又再一次的东张西望起来 hmmm 好吧为了庆祝又可以自由活动 特此献上抄来的小程序一篇 以
  • 解决Rosbridge自定义action信息问题

    前言 利用rosbridge开发一个网页版的action客户端 一 rosbridge原理 rosbridge协议 该协议的基本思想是将节点间的分布式通信 改成 client节点 与一个代理节点进行C S通信 然后代理节点再将请求转发给se
  • 多服务环境下定时任务重复执行问题解决方案

    当一个服务部署在多台服务器上时 定时任务可能出现多次执行的情况 就是每个服务上执行一次 有以下两种思路 一是固定死只有某服务器执行定时任务 二是随机暂停几秒 某一服务执行了 其他就不再执行 1 固定某一个服务器作为执行定时任务的机器 通过配
  • 基于混沌映射与差分进化的自适应教与学优化算法

    文章目录 一 理论基础 1 标准TLBO算法 2 混沌映射与差分进化的自适应TLBO算法 1 改进的Logistic混沌映射 2 惯性权重自适应调节函数 3 教改阶段 二 仿真实验与分析 三 参考文献 一 理论基础 1 标准TLBO算法 请
  • 在Power BI中用DAX新建列的方式进行累计求和

    在Power BI中用DAX新建列的方式进行累计求和 DAX 新建列来累计求和 累计求和 DAX 新建列 DAX函数 Filter DAX函数 EARLIER DAX函数 SUMX DAX 新建列来累计求和 Power BI有两种方式进行累
  • 没有node-sass Windows 64-bit with Node.js 16.x

    throw new Error errors missingBinary OS X 64 bit with Node js 16 x Windows 64 bit with Node js 16 x 1 下载node sass 对应的版本
  • 数据分析理论【5】之 下采样策略和上采样策略

    合辑传送门 gt gt 数据分析 合辑 在分类问题的数据中 很容易出现正反数据集数量存在极大的差距 这类数据直接用于训练不利于模型的构架 所以我们需要对数据进行些许处理 很容易想到 合理的数据集应该是正反数据集数量应接近 那就存在两种策略
  • python的艰难学习之路-综合练习--名片管理系统

    名片管理系统需求 1 显示欢迎界面 提示操作码 按照操作码执行程序 2 操作码功能包括 查询 查找 新增 3 查询出来后 可继续操作 gt 修改 删除 4 名片需要记录的信息 gt 编号 姓名 电话 邮箱 QQ 5 编号自动生成 6 如果在
  • 通过高德地图API取得两点坐标间的距离

    高德地图在取两点间的距离比百度地图更详细 可以分为几种类型的API 提供的步行 公交 驾车查询 今天咱们使用驾车的API来计算两点的距离 其它的API大同小异 参考高德地图的API地址 路径规划 API文档 开发指南 Web服务 API 高
  • RunBlocking CoroutineScope SupervisorScope Launch Async CoroutineStart协程启动模式 Job对象和生命周期

    协程的作用域构建器 RunBlocking runBlocking是常规函数 会把当前主线程包装成一个主协程 其会阻塞当前线程 只有当等待其主协程体以及里面的所有子协程执行结束以后 才会让当前线程执行 CoroutineScope coro