Asynchronous Kotlin中的延迟功能在内部如何工作?

Asynchronous Kotlin中的延迟功能在内部如何工作?,asynchronous,kotlin,coroutine,kotlin-coroutines,Asynchronous,Kotlin,Coroutine,Kotlin Coroutines,我一直试图了解Kotlin协同程序是如何工作的,我遇到了delay函数 我对这部作品的理解是, delay挂起当前线程,与sleep不同,该线程不消耗CPU周期,并被释放以执行其他任务 其工作原理是,延迟函数之后的代码被捕获为lambda(Continuation),并且可以在给定的时间段之后由不同的线程执行 该实现类似于Javascript的执行模型,其中的delay函数将继续存储在某种任务队列上,并释放当前线程。经过指定的时间后,将在可用线程上调度此任务 我的理解正确吗? 另外,调用de

我一直试图了解Kotlin协同程序是如何工作的,我遇到了
delay
函数

我对这部作品的理解是,

  • delay
    挂起当前线程,与
    sleep
    不同,该线程不消耗CPU周期,并被释放以执行其他任务
  • 其工作原理是,延迟函数之后的代码被捕获为lambda(Continuation),并且可以在给定的时间段之后由不同的线程执行
  • 该实现类似于Javascript的执行模型,其中的
    delay
    函数将继续存储在某种任务队列上,并释放当前线程。经过指定的时间后,将在可用线程上调度此任务
我的理解正确吗? 另外,调用
delay
的线程与调用
delay
后执行代码的线程之间是否存在关系


谢谢

是的。你的理解是正确的。JS和Kotlin之间的区别在于,程序员可以通过
CoroutineDispatcher
自定义用于执行延续的任务队列。通常,调用
delay
的线程与计划继续的线程之间没有关系。这取决于两个因素:

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

  • 如果协同路由使用某个受限的调度程序,那么它将在该调度程序定义的线程或线程池上恢复。许多调度员都是开箱即用的。例如,在Android中,使用
    UI
    dispatcher协程将始终在Android
    UI
    线程上恢复。通常,在Kotlin/JVM中,您可以使用
    ascoroutinedDispatcher
    扩展获取任何
    Executor
    并将其转换为
    CoroutineDispatcher


如果您对协同程序的工作方式感兴趣,这是一本不错的读物。