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

时间:2018-07-06 16:32:10

标签: asynchronous kotlin coroutine kotlin-coroutines

我一直试图了解Kotlin协程的工作原理,并且遇到了delay函数。

我对这项工作的理解是,

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

我的理解正确吗? 另外,在调用delay的线程和执行对delay的调用之后执行代码的线程之间是否存在关系。

谢谢!

1 个答案:

答案 0 :(得分:3)

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

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

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