科特林协同程序。启动{fun}和launch {suspend fun}之间的区别

时间:2018-03-06 15:46:49

标签: kotlin suspend kotlinx.coroutines

执行之间是否存在差异?

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

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

2 个答案:

答案 0 :(得分:8)

是的,有。

从语义上讲,对暂停函数的调用可能会暂停执行,这可能会在某个时间点(或从不)恢复,可能在不同的上下文中(例如另一个线程)。

为了确保这一点,编译器以特殊方式处理对挂起函数的调用:它生成将当前局部变量保存到Continuation实例并将其传递给挂起函数的代码,并且在那里&#39 ; s也是调用后字节码中的一个恢复点,执行将跳转到该点,加载局部变量并运行(带尾调用的角点)。

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

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

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

答案 1 :(得分:1)

让我加几美分

您基本上要求功能和暂停功能之间的区别。

一个协程只是一个线程,它不会占用太多的计算机内存。您可以轻松启动100,000个协同程序。 暂停函数基本上只是一个函数,但具有特殊的调用范围。它只能从协同程序和其他暂停函数调用。 从官方的Kotlin文档中可以看出

  

只允许从协程或调用挂起函数   另一个暂停功能。让我们深入了解它的含义。协同程序的最大优点是它们可以在不阻塞线程的情况下暂停。编译器必须发出一些特殊代码才能实现这一点,因此我们必须标记可能在代码中显式挂起的函数。