协程块中的方法在 Kotlin 中如何工作?
How does method in coroutine block work in Kotlin?
协程有两种类型。堆叠和无堆叠。而Kotlin协程是stackless协程。
另一方面,一旦一个方法被调用,它就会被堆叠在内存中。并且我们可以用方法进行递归调用。
而在 Kotlin 中,我需要做的就是为协程上下文中调用的方法添加 suspend
关键字。
它没有堆栈,那它是如何工作的?
我的猜测是,由于coroutine Object属于某个线程,线程有它们。可以说,是的。那么它是如何工作的呢?
Kotlin 协程实际上是堆栈和无堆栈的混合体。对于每个函数调用,都有一个常规的 Java 堆栈框架。当您从 suspend fun
调用 suspend fun
时,JVM 堆栈会以通常的方式增长,如果调用 return 没有发生任何挂起,堆栈也会以常见的 JVM 方式展开。
函数挂起时情况会有所不同。那时,Java 方法 return 和 JVM 堆栈展开。然而,在构建调用链的同时,另一个堆上结构正在形成:Continuation
个对象的链表。每个 suspend fun
调用都会创建另一个这样的对象,您可以将其视为堆栈帧(它包含所有局部变量的值),但在字节码级别实现,作为常规 Java 对象。
这个 Continuation
链是 Kotlin 协程的“无堆栈”方面。当您恢复延续时,您将进入最内层的函数调用(包含函数暂停的位置)。当该函数想要 return 时,它不会以正常方式 return,而是恢复其调用者的继续。这将在调用者中重复,因此当您向上 suspend fun
调用堆栈时,您也会向下 JVM 调用堆栈:JVM 堆栈随着可挂起函数的增加而增长 return.
协程有两种类型。堆叠和无堆叠。而Kotlin协程是stackless协程。
另一方面,一旦一个方法被调用,它就会被堆叠在内存中。并且我们可以用方法进行递归调用。
而在 Kotlin 中,我需要做的就是为协程上下文中调用的方法添加 suspend
关键字。
它没有堆栈,那它是如何工作的?
我的猜测是,由于coroutine Object属于某个线程,线程有它们。可以说,是的。那么它是如何工作的呢?
Kotlin 协程实际上是堆栈和无堆栈的混合体。对于每个函数调用,都有一个常规的 Java 堆栈框架。当您从 suspend fun
调用 suspend fun
时,JVM 堆栈会以通常的方式增长,如果调用 return 没有发生任何挂起,堆栈也会以常见的 JVM 方式展开。
函数挂起时情况会有所不同。那时,Java 方法 return 和 JVM 堆栈展开。然而,在构建调用链的同时,另一个堆上结构正在形成:Continuation
个对象的链表。每个 suspend fun
调用都会创建另一个这样的对象,您可以将其视为堆栈帧(它包含所有局部变量的值),但在字节码级别实现,作为常规 Java 对象。
这个 Continuation
链是 Kotlin 协程的“无堆栈”方面。当您恢复延续时,您将进入最内层的函数调用(包含函数暂停的位置)。当该函数想要 return 时,它不会以正常方式 return,而是恢复其调用者的继续。这将在调用者中重复,因此当您向上 suspend fun
调用堆栈时,您也会向下 JVM 调用堆栈:JVM 堆栈随着可挂起函数的增加而增长 return.