示例代码中的注释说 delay() 是非阻塞的。应该暂停吗?
https://kotlinlang.org/docs/reference/coroutines/basics.html
fun main() {
GlobalScope.launch { // launch new coroutine in background and continue
delay(1000L) // non-blocking delay for 1 second (default time unit is ms)
println("World!") // print after delay
}
println("Hello,") // main thread continues while coroutine is delayed
Thread.sleep(2000L) // block main thread for 2 seconds to keep JVM alive
}
delay
正在挂起且非阻塞。
TL;DR:delay
确实具有在当前协程中执行其后语句之前"等待"的效果。非阻塞仅意味着在此等待期间,当前线程可以执行其他操作。
Kotlin 文档经常说"非阻塞"来挂起函数,以明确它们不会阻塞当前线程,而只是挂起当前的协程。
有时可能会产生误导,因为"非阻塞"强调没有任何东西被阻塞的事实,而仍然应该明确挂起函数确实会挂起当前的协程(所以至少有些东西被阻塞了,即使线程本身继续)。
从当前协程的角度来看,它们挂起当前协程的事实使这些函数看起来是同步的,因为协程需要等待这些函数完成才能执行其余代码。但是,它们实际上并没有阻塞当前线程,因为它们的实现在幕后使用异步机制。