28 | launch的背后到底发生了什么?
- 深入了解
- 翻译
- 解释
- 总结
Kotlin协程是一种强大的并发编程工具,本文深入探讨了launch和async创建、启动新协程的内部运行机制,揭示了协程的基础元素和内部机制。通过分析createCoroutine{}和startCoroutine{}函数,揭示了协程的执行流程。文章还通过反编译代码展示了startCoroutine()方法的实现原理,深入剖析了协程的执行流程。通过对createCoroutine()和startCoroutine()的源码分析,读者可以更加透彻地了解Kotlin协程的内部运行机制。文章对于想要深入了解Kotlin协程的读者来说,是一篇极具价值的技术文章。 在文章中,通过分析launch{}的源代码,揭示了其内部启动协程的过程。通过反编译和源码分析,展示了startCoroutine()方法的实现原理,以及对应的Java代码。文章还推导了startCoroutineCancellable()方法的调用过程,深入剖析了launch启动协程的整个过程。此外,文章还提到了createCoroutine{}和startCoroutine{}是Kotlin提供的两个底层API,以及Kotlin协程框架在中间层实现了launch、async之类的协程构建器,对协程底层API进行了更好的封装。 总的来说,本文通过深入分析Kotlin协程的内部运行机制和源码实现,为读者提供了深入了解Kotlin协程的机会,对于想要深入学习该技术的读者具有重要的参考价值。
《朱涛 · Kotlin 编程第一课》,新⼈⾸单¥59
全部留言(14)
- 最新
- 精选
- 辉哥startCoroutine -> createCoroutineUnintercepted -> createCoroutineFromSuspendFunction,最终返回一个RestrictedContinuationImpl对象,然后调用其resume方法,从而调用block的invoke方法.最终调起协程.
作者回复: 很棒的解答!
2022-03-295 - 杨小妞createCoroutineUnintercepted这个函数的JVM实现在哪个包,哪个类下呢?
作者回复: 去Kotlin源码中,找一下这个类:IntrinsicsJvm.kt
2022-04-061 - Paul Shan思考题:调试了一下,结果是一样的。唯一的区别可能在于block原来被反编译成一个函数对象直接用实现状态机的Continuation对象赋值。加入函数赋值以后,block对象被实现为一个简单的内部类,这个内部类的invoke函数再去调用Continuation对象。
作者回复: 是的。
2022-03-281 - ACE_Killer09代码段16中, 我理解resume 之后 会回到 LaunchUnderTheHoodKt$testLaunch$1 # invoke ,再进一步到invokeSuspend 进入状态机的流程。那么 Continuation#resume -> invoke这个过程是怎么调用过来的?
作者回复: 你可以去看看BaseContinuationImpl#resumeWith(),具体逻辑在那里。
2022-04-16 - L先生反编译了一下,block最终会转成function1。(this as Function1, Any?>).invoke(it)中的invoke是指的这个Function1中的invoke吗
作者回复: 接近了~~
2022-03-28 - L先生打印没啥区别啊。应该是走这里了。createCoroutineFromSuspendFunction(probeCompletion) { (this as Function1, Any?>).invoke(it) }。但是我看不太懂。this指什么,it又指什么参数
作者回复: 嗯,方向已经对了。
2022-03-282 - Allen关于思考题的思考: 我认为执行流程及结果和代码段 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-03-28 - 郑峰深层认识: suspend function type 底层被实现为Continuation。所以协程启动就是Continuation的resume。协程的启动实际上是Continuation的一个应用。2022-08-23归属地:美国1
- Temme”注释 2 处的 (this is BaseContinuationImpl) 条件一定是为 true 的“ 这句话好像是错的SuspendLambda并不是BaseContinuationImpl的子类2024-02-16归属地:上海1
- anmi完了,现在编译后没有block这个类2024-01-15归属地:江苏