执行上有区别吗?
launch {
function1()
}
fun function1(){
DoSomething...
}
和
launch {
function2()
}
suspend fun function2(){
DoSomething...
}
执行上有区别吗?
launch {
function1()
}
fun function1(){
DoSomething...
}
和
launch {
function2()
}
suspend fun function2(){
DoSomething...
}
就在这里。
从语义上讲,对挂起函数的调用可能会挂起执行,这可能会在稍后(或从不)恢复,可能在不同的上下文中(例如另一个线程)。
为了确保这一点,编译器以一种特殊的方式处理对挂起函数的调用:它生成将当前局部变量保存到Continuation
实例中并将其传递给挂起函数的代码,并且在调用之后的字节码中还有一个恢复点,执行将跳转到的地方,加载局部变量并继续运行(带有尾调用的极端情况)。
对非挂起函数的调用被编译为更简单的字节码,与正常调用挂起函数体之外的函数相同。
您可以在此处找到有关 Kotlin 协程设计和实现的详细信息:Coroutines for Kotlin
您还可以检查生成的编译字节码以查看差异:Kotlin 字节码 - 如何在 IntelliJ IDEA 中分析?
让我加几分钱
您基本上是在询问函数和挂起函数之间的区别。
协程就像一个线程,只是它不需要太多的计算机内存。您可以轻松启动 100,000 个协程。挂起函数基本上只是一个函数,但具有特殊的调用范围。它只能从协程和其他挂起的函数中调用。从官方 Kotlin 文档中,它说
挂起函数只允许从协程或另一个挂起函数中调用。让我们深入了解它的含义。协程最大的优点是可以挂起而不阻塞线程。编译器必须发出一些特殊代码才能实现这一点,因此我们必须在代码中标记可能显式挂起的函数。