Kotlin 内部的 delay 函数是如何工作的?
How does the delay function in Kotlin internally work?
我一直在尝试了解 Kotlin 协程的工作原理,并且遇到了 delay
函数。
我对这部作品的理解是,
delay
挂起当前线程,与 sleep
不同的是,线程不消耗 CPU 周期并被释放以执行其他任务。
- 这是如何工作的,延迟函数之后的代码被捕获为 lambda(Continuation),并且可以在给定的时间段后由不同的线程执行。
- 该实现似乎类似于 Javascript 的执行模型,其中
delay
函数导致继续存储在某种任务队列中并释放当前线程。指定时间过后,此任务将安排在可用线程上。
我的理解对吗?
此外,调用 delay
的线程与调用 delay
.
后执行代码的线程之间是否存在关系
谢谢!
是的。你的理解是正确的。 JS 和 Kotlin 的区别在于,用于执行延续的任务队列可以由程序员通过 CoroutineDispatcher
自定义。一般来说,调用delay
的线程和continuation被安排恢复的线程是没有关系的。它由两个因素决定:
如果协同程序使用 Unconfined
调度程序,则继续继续的线程是在 delay
的实现中内部使用的某个系统计时器线程。您可以编写自己的 delay
版本,在您选择的线程上恢复 Unconfined
延续。
如果协程使用一些受限的调度程序,那么它将在该调度程序定义的线程或线程池上恢复。开箱即用地提供了许多调度程序。例如,在 Android 中使用 UI
调度程序,协程将始终在 Android UI
线程上恢复。通常,在 Kotlin/JVM 中,您可以采用任何 Executor
并使用 asCoroutineDispatcher
扩展名将其转换为 CoroutineDispatcher
。
我一直在尝试了解 Kotlin 协程的工作原理,并且遇到了 delay
函数。
我对这部作品的理解是,
delay
挂起当前线程,与sleep
不同的是,线程不消耗 CPU 周期并被释放以执行其他任务。- 这是如何工作的,延迟函数之后的代码被捕获为 lambda(Continuation),并且可以在给定的时间段后由不同的线程执行。
- 该实现似乎类似于 Javascript 的执行模型,其中
delay
函数导致继续存储在某种任务队列中并释放当前线程。指定时间过后,此任务将安排在可用线程上。
我的理解对吗?
此外,调用 delay
的线程与调用 delay
.
谢谢!
是的。你的理解是正确的。 JS 和 Kotlin 的区别在于,用于执行延续的任务队列可以由程序员通过 CoroutineDispatcher
自定义。一般来说,调用delay
的线程和continuation被安排恢复的线程是没有关系的。它由两个因素决定:
如果协同程序使用
Unconfined
调度程序,则继续继续的线程是在delay
的实现中内部使用的某个系统计时器线程。您可以编写自己的delay
版本,在您选择的线程上恢复Unconfined
延续。如果协程使用一些受限的调度程序,那么它将在该调度程序定义的线程或线程池上恢复。开箱即用地提供了许多调度程序。例如,在 Android 中使用
UI
调度程序,协程将始终在 AndroidUI
线程上恢复。通常,在 Kotlin/JVM 中,您可以采用任何Executor
并使用asCoroutineDispatcher
扩展名将其转换为CoroutineDispatcher
。