【深入理解Kotlin协程】协程的创建、启动、挂起函数【理论篇】

本文深入探讨Kotlin协程,包括协程的创建、启动和挂起函数的工作原理。文章介绍了Continuation的结构及其在挂起函数中的作用,以及如何通过CPS变换实现异步代码的同步编写。还讨论了挂起点和如何避免回调地狱,揭示了挂起函数如何在看起来同步的情况下执行异步任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

kotlin实现恢复挂起点是通过一个接口类Continuation(英文翻译过来叫"继续、延续、续体")来实现的。
Kotlin 续体有两个接口: Continuation  和 CancellableContinuation, 顾名思义 CancellableContinuation 是一个可以取消的 Continuation
public interface Continuation<in T> {
    public val context: CoroutineContext
    public fun resumeWith(result: Result<T>)
}

Continuation 的成员

  • val  contextCoroutineContext: 当前协程的 CoroutineContext 上下文
  • fun  resumeWith(result: Result<T>): 传递 result 恢复协程
CancellableContinuation 成员
  • isActive, isCompleted, isCancelled: 表示当前 Continuation 的状态
  • fun  cancel(cause: Throwable? = null): 可选通过一个异常 cause 来取消当前 Continuation 的执行
可以将 Continuation 看成是在挂起点恢复后需要执行的代码封装(状态机实现),比如说对如下逻辑:
suspend fun request() = suspendCoroutine<Response> {
    val response = doRequest()
    it.resume(response)
}

fun test() = runBlocking {
    val response = request()
    handle(response)
}

用下面的伪代码简单描述 Continuation 的工作:

interface Continuation<T> {
    fun resume(t: T)
}

fun request(continuation: Continuation<Response>) {
    val response = doRequest()
    continuation.resume(response)
}

fun test() {
    request(object :Continuation<Response>{
        override fun resume(response: Response) {
            handle(response)
        }
    })
}
对于 suspend 关键词修饰的挂起函数,编译器会为其增加一个 Continuation 续体类型的参数(相当于 CPS 中的回调),可以通过这个 Continuation 续体对象的 resume 方法返回结果值来恢复协程的执行。

协程的创建

在kotlin当中创建一个简单协程不是什么难事
标准库中提供了一个  createCoroutinue 函数,我们可以通过它来创建协程,不过这个协程并不会立即执行。
我们先来看看它的声明:
 
fun <T> (suspend () -> T).createCoroutine(completion: Continuation<T>): Continuation<Unit>
其中  suspend () -> T 是  createCoroutinue 函数的  Receiver
  • Receiver 是一个被  suspend 修饰的挂起函数,这也是协程的执行体,我们不妨称它为 协程体。
  • 参数  completion 会在协程执行完成后调用,实际上就是协程的 完成回调
  • 返回值是一个  Continuation 对象,由于现在协程仅仅被创建处理,因此需要通过这个值在之后触发协程的启动。

协程的启动

             
我们已经知道如何创建协程,那么协程要如何运行呢?调用  continuation.resume(Unit) 之后,协程体会立即开始执行。                                              
通过阅读  createCoroutine 的源码或者直接打断点调试,我们可以得知  continuation 是  SafeContinuation
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

川峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值