Kotlin协程中的delay()是非阻塞函数吗?

Kotlin协程中的delay()是非阻塞函数吗?,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,示例代码中的注释表示delay()是非阻塞的。应该暂停吗 延迟是挂起和非阻塞 TL;DR:delay在当前协同程序中执行紧随其后的语句之前,确实具有“等待”的效果。非阻塞仅仅意味着在等待期间,当前线程可以执行其他操作 Kotlin文档中经常提到挂起函数的“非阻塞”,以明确它们不会阻塞当前线程,而只是挂起当前的协同路由 有时这可能会产生误导,因为“非阻塞”强调的是没有任何东西被阻塞,但仍然应该明确的是,挂起函数确实挂起了当前的协程(因此,至少有一些东西被阻塞了,即使线程本身在运行) 从当前协同

示例代码中的注释表示delay()是非阻塞的。应该暂停吗


延迟
是挂起和非阻塞

TL;DR:
delay
在当前协同程序中执行紧随其后的语句之前,确实具有“等待”的效果。非阻塞仅仅意味着在等待期间,当前线程可以执行其他操作


Kotlin文档中经常提到挂起函数的“非阻塞”,以明确它们不会阻塞当前线程,而只是挂起当前的协同路由

有时这可能会产生误导,因为“非阻塞”强调的是没有任何东西被阻塞,但仍然应该明确的是,挂起函数确实挂起了当前的协程(因此,至少有一些东西被阻塞了,即使线程本身在运行)


从当前协同程序的角度来看,它们挂起当前协同程序的事实使这些函数看起来是同步的,因为协同程序需要等待这些函数完成,然后再执行其余的代码。但是,它们实际上并不阻止当前线程,因为它们的实现在幕后使用了异步机制。

这是一个正确的描述,因为它不阻止任何线程,只是暂停当前的协同进程。非阻止是计算机科学中定义良好的术语。根据定义,println(“World!”)将立即运行,而不是等待1秒。如果你的意思不同,就不要用这个词。我的意思肯定没有什么不同,我不明白你想说什么。正如我刚才解释的,延迟不是阻塞调用。@莫伊拉:延迟是挂起和非阻塞。乔弗里已经回答了。它不仅仅是“非阻塞”。@Moira:正如你所说,“它只是暂停当前的协同程序”。为什么延迟通话的评论没有这样说?相反,评论是“非阻塞”。这不是误导吗?谢谢!你的回答是合理的。这里的“非阻塞”真的是误导。正式文件不应将此定义明确的术语用于其他内容。协同程序是一个新特性。定义一组新的术语来解释这些特性是值得的。@user1443721 FWIW这个术语对于异步编程来说一点也不陌生;请参见示例。@user1443721这正是Kotiln所做的。新的术语是“挂起”,而旧的术语(“阻塞”)保留了旧的含义,仍然是指线程。@Moira:非阻塞已经得到了很好的定义,甚至早于C#。检查一下这个问题的答案,@Marko Topolnik:“挂起”不是新术语。它被用来描述线程的生命周期。我的问题主要是关于示例中delay()函数的注释。
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
}