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


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

    Continuation 的成员

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

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

    1. interface Continuation<T> {
    2. fun resume(t: T)
    3. }
    4. fun request(continuation: Continuation<Response>) {
    5. val response = doRequest()
    6. continuation.resume(response)
    7. }
    8. fun test() {
    9. request(object :Continuation{
    10. override fun resume(response: Response) {
    11. handle(response)
    12. }
    13. })
    14. }
    对于 suspend 关键词修饰的挂起函数,编译器会为其增加一个 Continuation 续体类型的参数(相当于 CPS 中的回调),可以通过这个 Continuation 续体对象的 resume 方法返回结果值来恢复协程的执行。

    协程的创建

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

    协程的启动

                 
    我们已经知道如何创建协程,那么协程要如何运行呢?调用  continuation.resume(Unit) 之后,协程体会立即开始执行。                                              
    通过阅读  createCoroutine 的源码或者直接打断点调试,我们可以得知  continuation 是
  • 相关阅读:
    基于蚁群结合遗传算法的路径规划问题附Matlab代码
    计算机系统的层次结构
    Design Compiler工具学习笔记(5)
    基于JSP的员工绩效考核系统
    Windows之应用安装程序 —— winget
    CodeForces484A——Bits(贪心算法)
    【深度学习实验】前馈神经网络(一):使用PyTorch构建神经网络的基本步骤
    FreeMarker快速入门详解
    sftp 从windows10向linux(centos7)传输文件
    汽车三高试验离不开的远程试验管理平台-TFM
  • 原文地址:https://blog.csdn.net/lyabc123456/article/details/127792288