Asynchronous Kotlin中的延迟功能在内部如何工作?
我一直试图了解Kotlin协同程序是如何工作的,我遇到了Asynchronous Kotlin中的延迟功能在内部如何工作?,asynchronous,kotlin,coroutine,kotlin-coroutines,Asynchronous,Kotlin,Coroutine,Kotlin Coroutines,我一直试图了解Kotlin协同程序是如何工作的,我遇到了delay函数 我对这部作品的理解是, delay挂起当前线程,与sleep不同,该线程不消耗CPU周期,并被释放以执行其他任务 其工作原理是,延迟函数之后的代码被捕获为lambda(Continuation),并且可以在给定的时间段之后由不同的线程执行 该实现类似于Javascript的执行模型,其中的delay函数将继续存储在某种任务队列上,并释放当前线程。经过指定的时间后,将在可用线程上调度此任务 我的理解正确吗? 另外,调用de
delay
函数
我对这部作品的理解是,
挂起当前线程,与delay
不同,该线程不消耗CPU周期,并被释放以执行其他任务sleep
- 其工作原理是,延迟函数之后的代码被捕获为lambda(Continuation),并且可以在给定的时间段之后由不同的线程执行
- 该实现类似于Javascript的执行模型,其中的
函数将继续存储在某种任务队列上,并释放当前线程。经过指定的时间后,将在可用线程上调度此任务delay
delay
的线程与调用delay
后执行代码的线程之间是否存在关系
谢谢 是的。你的理解是正确的。JS和Kotlin之间的区别在于,程序员可以通过
CoroutineDispatcher
自定义用于执行延续的任务队列。通常,调用delay
的线程与计划继续的线程之间没有关系。这取决于两个因素:
- 如果协同程序使用
调度程序,则继续继续的线程是在未限定
实现中内部使用的某个系统计时器线程。您可以编写自己版本的延迟
,在您选择的线程上继续delay
continuationsUnconfined
- 如果协同路由使用某个受限的调度程序,那么它将在该调度程序定义的线程或线程池上恢复。许多调度员都是开箱即用的。例如,在Android中,使用
dispatcher协程将始终在AndroidUI
线程上恢复。通常,在Kotlin/JVM中,您可以使用UI
扩展获取任何ascoroutinedDispatcher
并将其转换为Executor
CoroutineDispatcher