
本文翻译自:
https://blog.shreyaspatil.dev/sleepless-concurrency-delay-vs-threadsleep
毫无疑问,Kotlin 语言中的协程 Coroutine 极大地帮助了开发者更加容易地处理异步编程。该特性中封装的诸多高效 API,可以确保开发者花费更小的精力去完成并发任务。一般来说,开发者了解一下如何使用这些 API 就足够了!
可就 JVM 的角度而言,协程一定程度上减少了*“回调地狱”*的问题,切实地改进了异步处理的编码方式。
相信包括笔者在内的很多开发者常常会好奇协程的背后到底是如何做到的。所以,本文将以 delay() 为切入点,带开发者剖析下协程的背后原理。
目录前瞻:
delay()干啥用的?sleep()呢?- 对比 delay() 和 sleep()
- 剖析
delay()原理
1. delay() 干啥用的?
使用过协程的开发者大概率对 delay() 并不陌生,anyway,先来看下官方针对该函数的描述:
“delay() 用来延迟协程一段时间,但不阻塞线程,并且能在指定的时间后恢复协程的执行。”
来看一段在 task1 执行 2000ms 后执行 task2 的示例代码:
scope.launch {
doTask1()
delay(2000)
doTask2()
}
代码很简单,但需要再次提醒一些关于 delay() 的重要特点:
- 它不会阻塞当前运行的线程
- 但它允许其他协程在同线程运行
- 当延迟的时间到了,协程会被恢复并继续执行
很多开发者常常会将 delay() 和 Java 语言的 sleep() 进行比较。可事实上,这两个函数用作完全不同的场景,只是命名上看起来有点相似而已。。。
2. sleep() 呢?
sleep() 则是 Java 语言中标准的多线程处理 API:促使当前执行的线程进入休眠,并持续指定的一段时间。
“该方法一般用来告知 CPU 让出处理时间给 App 的其他线程或者其他 App 的线程。”
如果在协程里使用该函数,它会导致当前运行的线程被阻塞,同时也会导致该线程的其他协程被阻塞,直到指定的阻塞时间完成。
为了解更多的细节,让我们通过示例进一步地对比 sleep() 和 delay() 两者。
3. 对比 delay() 和 sleep()
假使我们想在单线程(就比如 Android 开发里的主线程)里执行

本文详细解析了Kotlin协程中的delay()功能,与Java的sleep()进行对比,阐述了delay()如何不阻塞线程并实现异步恢复,以及其背后的Dispatcher实现原理。
最低0.47元/天 解锁文章
1054

被折叠的 条评论
为什么被折叠?



