日期:
来源:郭霖收集编辑:史大拿
/ 今日科技快讯 /
近日,经历了一次停办,两次规模严重缩水之后,2023年世界移动通信大会(MWC)终于再现往日盛况:有来自200多个国家和地区的2000多家厂商参加,并在此次展会上发布了最新的产品与科技,仅中国就有100余家厂商参展。
每年的MWC都被称作“全球移动通信技术发展的风向标”,今年大会以“时不我待——明日科技,将至已至”为主题,具体又围绕着5G新动能、数字万物、开放网络、超越现实+ 、金融科技等五大热点主题展开。
/ 作者简介 /
本篇文章转自史大拿的博客,文章主要分享了对kotlin协程源码的分析,相信会对大家有所帮助!
原文地址:
https://juejin.cn/post/7204752219915288636
/ 前言 /
kotlin协程源码十分庞大,本篇只能把我理解的源码聊一聊,不会特别深入研究,只会浅浅的看看表层。本来计划协程系列是10篇左右,后续是flow热流冷流之类的,冷流操作符之类的应该不会在写了,flow当作Rxjava来用就可以,后续可能还会写一篇关于热流的文章。也可能没有:) 主要是不好写,文字写出来还是比较生硬。
/ launch 浅析 /
源码阅读从最简单的一个launch开始!
在launch的时候,会执行CoroutineScope.newCoroutineContext函数。这里会传入一个EmptyCoroutineContext。CoroutineScope.newCoroutineContext会走foldCopies , 这个函数是用来合并2个协程的。
先来看看 foldCopies的参数:
coroutineContext // 可以看出,此时coroutineContext为JobImpl我们稍后来看看它是在什么时候赋值的 context // 默认什么都没有传,是EmptyCoroutineContext true // isNewCoroutine是否创建新的Coroutine
DEFAULT LAZY UNDISPATCHED ATOMIC // 实验中
https://github.com/JetBrains/kotlin/blob/v1.8.20-Beta/libraries/stdlib/jvm/src/kotlin/coroutines/intrinsics/IntrinsicsJvm.kt
data class TestBean(val message: String)
fun main() {
fun test(receiver: TestBean, block: suspend TestBean.() -> String) {
block.createCoroutine(receiver, object : Continuation<String> { // 创建协程
override val context: CoroutineContext
get() = EmptyCoroutineContext
override fun resumeWith(result: Result<String>) {// 当协程恢复的时候执行
println("resume:$result")
}
})
}
val bean = TestBean("测试数据")
test(bean) {
println("我是test内部方法${this}")
"我是返回数据"
}
}
createCoroutine // 创建协程 [默认挂起] startCoroutine // 直接开启一个协程
(suspend R.() -> T).startCoroutine // 有receiver直接恢复协程 (suspend R.() -> T).createCoroutine // 有receiver创建协程,需要手动恢复 (suspend () -> T).startCoroutine // 没有receiver直接恢复协程 (suspend () -> T).createCoroutine // 没有receiver创建协程,需要手动恢复
https://gitee.com/lanyangyangzzz/coroutine-project/blob/main/app/src/main/java/com/szj/coroutine/project/jvm/blog6/SafeContinuationTest.kt