• 辉哥
    2022-03-29
    startCoroutine -> createCoroutineUnintercepted -> createCoroutineFromSuspendFunction,最终返回一个RestrictedContinuationImpl对象,然后调用其resume方法,从而调用block的invoke方法.最终调起协程.

    作者回复: 很棒的解答!

    
    5
  • 杨小妞
    2022-04-06
    createCoroutineUnintercepted这个函数的JVM实现在哪个包,哪个类下呢?

    作者回复: 去Kotlin源码中,找一下这个类:IntrinsicsJvm.kt

    
    1
  • Paul Shan
    2022-03-28
    思考题:调试了一下,结果是一样的。唯一的区别可能在于block原来被反编译成一个函数对象直接用实现状态机的Continuation对象赋值。加入函数赋值以后,block对象被实现为一个简单的内部类,这个内部类的invoke函数再去调用Continuation对象。

    作者回复: 是的。

    
    1
  • ACE_Killer09
    2022-04-16
    代码段16中, 我理解resume 之后 会回到 LaunchUnderTheHoodKt$testLaunch$1 # invoke ,再进一步到invokeSuspend 进入状态机的流程。那么 Continuation#resume -> invoke这个过程是怎么调用过来的?

    作者回复: 你可以去看看BaseContinuationImpl#resumeWith(),具体逻辑在那里。

    
    
  • L先生
    2022-03-28
    反编译了一下,block最终会转成function1。(this as Function1, Any?>).invoke(it)中的invoke是指的这个Function1中的invoke吗

    作者回复: 接近了~~

    
    
  • L先生
    2022-03-28
    打印没啥区别啊。应该是走这里了。createCoroutineFromSuspendFunction(probeCompletion) { (this as Function1, Any?>).invoke(it) }。但是我看不太懂。this指什么,it又指什么参数

    作者回复: 嗯,方向已经对了。

    共 2 条评论
    
  • Allen
    2022-03-28
    关于思考题的思考: 我认为执行流程及结果和代码段 3 中是完全一样的。因为 private suspend fun func(): String { println("Hello!") delay(1000L) println("World!") return "Result" } 和 val block = suspend { println("Hello!") delay(1000L) println("World!") "Result" } 完全是等价的写法。

    作者回复: 写法是等价的,那么执行流程有变化吗?

    
    
  • 郑峰
    2022-08-23 来自美国
    深层认识: suspend function type 底层被实现为Continuation。所以协程启动就是Continuation的resume。协程的启动实际上是Continuation的一个应用。
    
    1
  • zs
    2022-09-19 来自中国香港
    BaseContinuationImpl 里面的resumeWith()方法里面会判断 completion 是不是 BaseContinuationImpl,在挂起函数恢复的实话都是调用的suspendLambda的 resumeWith方法,所以才会调用suspendLambda 的invokeSuspend方法,那什么时候调用AbstractCoroutine()的resumeWith方法恢复整个协程呢
    
    