asynchronous - Kotlin 内部的延迟函数是如何工作的?
问题描述
我一直试图了解 Kotlin 协程是如何工作的,并且遇到了这个delay
函数。
我对这部作品的理解是,
delay
挂起当前线程,与 不同sleep
,该线程不消耗 CPU 周期并被释放以执行其他任务。- 其工作原理是延迟函数之后的代码被捕获为 lambda(Continuation),并且可以在给定时间段后由不同的线程执行。
- 该实现似乎类似于 Javascript 的执行模型,其中该
delay
函数将延续存储在某种任务队列中并释放当前线程。经过指定的时间后,此任务将安排在可用线程上。
我的理解正确吗?delay
此外,调用的线程和执行调用之后的代码的线程之间是否存在关系delay
。
谢谢!
解决方案
是的。你的理解是正确的。JS 和 Kotlin 的区别在于,用于执行延续的任务队列可以由程序员通过CoroutineDispatcher
. delay
通常,调用的线程与计划继续进行恢复的线程之间没有关系。它由两个因素决定:
如果协程使用
Unconfined
调度器,那么继续执行的线程是在内部使用的某个系统定时器线程delay
。您可以编写自己的版本,在您选择的线程上delay
恢复Unconfined
延续。如果协程使用某个受限的调度程序,那么它会在该调度程序定义的线程或线程池上恢复。开箱即用地提供了许多调度程序。例如,在使用
UI
调度程序的 Android 中,协程将始终在 AndroidUI
线程上恢复。一般来说,在 Kotlin/JVM 中,您可以使用任何扩展名Executor
并将其转换为CoroutineDispatcher
使用asCoroutineDispatcher
扩展名。
推荐阅读
- reactjs - 反向framework7页面转换
- github - Debain/Composer 无法连接到 github(443 和 22)
- kubernetes - istio 是否可以通过 uri 路径的动态部分支持到不同服务的路由
- c# - 如何检查 TCP 缓冲区是否已满
- javascript - 我可以将#ID 列表合并到一个类中吗?
- android - 在android应用程序中扩展底部工作表对话框
- google-chrome-extension - 文本上的 Chrome 扩展工具提示(一个单词)
- jquery - Uncaught TypeError: $ is not a function / body.getScroll is not a function
- javascript - 来自javascript的google api:未捕获的TypeError:无法读取未定义的属性“授权”
- sql - 提取附加查询的分钟数