Kotlin 中的延迟函数内部是如何工作的?

abh*_*war 3 asynchronous coroutine kotlin kotlin-coroutines

我一直在尝试了解 Kotlin 协程是如何工作的,我遇到了这个delay函数。

我对这部作品的理解是,

  • delay挂起当前线程,与 不同的是sleep,该线程不消耗 CPU 周期并被释放以执行其他任务。
  • 这是如何工作的,延迟函数之后的代码被捕获为 lambda(Continuation),并且可以在给定的时间段后由不同的线程执行。
  • 该实现似乎类似于 Javascript 的执行模型,其中该delay函数使延续存储在某种任务队列中并释放当前线程。指定时间过后,此任务将安排在可用线程上。

我的理解正确吗?此外,调用delay的线程与执行调用delay.

谢谢!

Rom*_*rov 6

是的。你的理解是对的。JS 和 Kotlin 的区别在于,用于执行延续的任务队列可以由程序员通过CoroutineDispatcher. 一般情况下,调用delay的线程与调度继续执行的线程之间没有关系。它由两个因素决定:

  • 如果协程使用Unconfined调度程序,那么继续恢复的线程是在delay实现中内部使用的某个系统计时器线程。您可以编写自己的版本,在您选择的线程上delay继续Unconfined延续。

  • 如果协程使用某个受限的调度程序,则它会在该调度程序定义的线程或线程池上恢复。提供了许多开箱即用的调度员。例如,在 Android 中使用UI调度程序协程将始终在 AndroidUI线程上恢复。通常,在 Kotlin/JVM 中,您可以使用任何扩展名Executor并将其转换为CoroutineDispatcher使用asCoroutineDispatcher扩展名。