kotlin 协程。启动{乐趣}和启动{暂停乐趣}之间的区别

标签 kotlin suspend kotlinx.coroutines

两者在执行上有什么区别吗?

launch {
    function1()
}
fun function1(){
    DoSomething...
}

launch {
   function2()
}
suspend fun function2(){
   DoSomething...
}

最佳答案

是的,有。

从语义上讲,对挂起函数的调用可能会挂起执行,这可能会在稍后(或从不)恢复,可能在不同的上下文中(例如另一个线程)。

为确保这一点,编译器以特殊方式处理对挂起函数的调用:它生成将当前局部变量保存到 Continuation 实例的代码并将其传递给挂起函数,并且调用之后的字节码中还有一个恢复点,执行将跳转到该点,加载局部变量并继续运行(带有尾调用的极端情况)。

对非挂起函数的调用被编译为更简单的字节码,与正常调用挂起函数体之外的函数相同。

您可以在此处找到有关 Kotlin 协程设计和实现的详细信息:Coroutines for Kotlin

您还可以检查生成的编译字节码以查看差异:Kotlin Bytecode - How to analyze in IntelliJ IDEA?

关于kotlin 协程。启动{乐趣}和启动{暂停乐趣}之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49134823/

相关文章:

java - 挂起 Web 请求(线程)

android - 从 kotlin 中的整洁架构定义用例的惯用方式

ANDROID: org.gradle.api.GradleException: 找不到满足版本约束的 'org.jetbrains.kotlin:kotlin-stdlib' 版本

kotlin - 使用in运算符将字符串与字符串范围进行比较

kotlin - 默认情况下,对讲不关注内部片段开始时的任何 View

java - 如何在 Java 或 Kotlin 中使用我自己的注释包装 @Column 注释

tomcat - 亚马逊AWS和tomcat不间断(优雅)部署

c# - Windows 服务 OnPowerEvent

Kotlin 协程 GlobalScope.launch 与 runBlocking

android - 在 retrofit 认证器中使用协程