kotlin -协程学习的第二天

106 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

协程构建器

launch与async构建器都用来启动新的协程

  1. launch 返回一个job 并且不附带任何结果值
  2. async 返回一个deferred(也是一个job),可以使用await得到结果

Job对象

对于每一个创建的协程(通过launch或者async),会返回一个job实例,该实例是协程的唯一标示,并且负责管理协程的生命周期

一个任务可以包含一系列状态:新创建(new)、活跃(Active)、完成中(completing)、已完成(completed)、取消中(cancelling)和已取消(cancelled)。虽然我们无法访问这些状态,但是我们可以访问job的属性:isActive,isCancelled,isCompleted

Job的生命周期

image.png

isActive:job.isActive()返回true时表示协程处于活跃状态。 isCancelled:调用了job.cancel()方法,job.isCancelled()返回true,表示协程处于取消状态。 isCompleted:协程执行完后,job.isCompleted返回true,表示协程处于结束状态。 start:启动协程,蓝家在模式下使用。 cancel:取消协程。

协程作用域构建器

  • coroutineScope 挂起函数
  • runBlocking 常规函数 他们都会等待其他协程体以及所有子协程结束,主要区别在与runBlocking方法会阻塞当前线程来等待,而coroutineScope只会挂起,会释放底层线程用于其他

协程的作用域构建器

coroutineScope与supervisorScope的区别

  • coroutineScope:一个协程失败了,所有其他兄弟协程也会被取消。
  • supervisorScope:一个协程失败了,不会影响其他兄弟协程

协程的启动模式

  1. Default:协助程创建后,立即开始调度,在调度前如果协程被取消,则直接进入取消响应的状态
  2. ATOMIC:协程创建后,立即开始调度,协程执行到第一个挂起点之前不响应取消
  3. LAZY:只有协程被需要时,包括主动调用协程的start,join或者await等函数时才会开始调度,如果调度前被取消,那么该协程直接进入异常结束状态
  4. UNDISPATCHED:协程创建后立即在当前函数调用栈中执行,知道遇到第一个挂起点