我一直试图了解Kotlin协程的工作原理,并且遇到了delay
函数。
我对这项工作的理解是,
delay
挂起当前线程,与sleep
不同,该线程不占用CPU周期,可以释放执行其他任务的时间。delay
函数使延续存储在某种任务队列中并释放当前线程。经过指定的时间后,将在可用线程上安排此任务。我的理解正确吗?
另外,在调用delay
的线程和执行对delay
的调用之后执行代码的线程之间是否存在关系。
谢谢!
答案 0 :(得分:3)
是的。您的理解是正确的。 JS和Kotlin之间的区别在于,程序员可以通过CoroutineDispatcher
来定制用于执行延续的任务队列。通常,调用delay
的线程与计划继续进行恢复的线程之间没有关系。它由两个因素决定:
如果协程使用Unconfined
调度程序,则继续恢复的线程是在delay
实现中内部使用的某些系统计时器线程。您可以编写自己的delay
版本,以在您选择的线程上继续Unconfined
继续。
如果协程使用某些受限的调度程序,则它将在该调度程序定义的线程或线程池上恢复。开箱即用地提供了许多调度程序。例如,在使用UI
调度程序的Android中,协程将始终在Android UI
线程上恢复。通常,在Kotlin / JVM中,您可以使用Executor
扩展名将任何CoroutineDispatcher
转换为asCoroutineDispatcher
。