协程块中的方法如何在 Kotlin 中工作?

c-a*_*-an 2 coroutine kotlin kotlin-coroutines kotlin-coroutines-flow

协程有两种类型。堆叠和无堆叠。而 Kotlin 协程是无栈协程。

另一方面,一旦一个方法被调用,它就会被堆叠在内存中。我们可以使用方法进行递归调用。

在 Kotlin 中,我需要做的就是suspend为协程上下文中调用的方法添加关键字。

它没有堆栈,那么它是如何工作的?

我的猜测是,由于协程对象属于某个线程,因此该线程拥有它们。让我们说,是的。那么它是如何在引擎盖下工作的呢?

Mar*_*nik 7

Kotlin 协程实际上是有栈和无栈的混合体。对于每个函数调用,都有一个常规的 Java 堆栈帧。当您suspend fun从 a调用 a时suspend fun,JVM 堆栈以通常的方式增长,如果调用返回而没有发生任何挂起,堆栈也会以常见的 JVM 方式展开。

当一个函数挂起时,事情就变得不同了。此时,Java 方法返回,JVM 堆栈展开。然而,在建立调用链的同时,另一个堆上结构正在形成:Continuation对象的链表。每次suspend fun调用都会创建另一个这样的对象,您可以将其视为堆栈帧(它包含所有局部变量的值),但在字节码级别实现,作为常规 Java 对象。

Continuation链是 Kotlin 协程的“无堆栈”方面。当您恢复延续时,您将进入最里面的函数调用(包含函数挂起的位置)。当该函数想要返回时,它不会以正常方式返回,而是会恢复其调用者的继续。这将重复调用者,所以为您的旅行suspend fun调用堆栈,你会还行驶下来的JVM调用堆栈:在JVM堆栈增长为悬浮函数返回。