【问题标题】:runBlocking() doesn't block the thread in this situationrunBlocking() 在这种情况下不会阻塞线程
【发布时间】:2020-11-08 23:05:39
【问题描述】:

我对 runBlocking() 和 coroutineScope() 感到困惑。我已经阅读了很多关于此的内容,但我仍然感到困惑。我知道 runBlocking() 会阻塞线程,而 coroutineScope() 会挂起协程,但我不清楚它的含义。

在此示例中,它先打印 A,然后打印 B。但是,runBlocking() 应该阻塞线程,直到它的所有代码完成。因此,当线程被 runBlocking() 阻塞时,不应打印 A。它应该先打印 B,然后再打印 A。

runBlocking {
        launch {
            delay(1000L)
            println("A")
        }
        runBlocking {
            delay(3000L)
            println("B")
        }
    }

在其他代码中,它先打印 B,然后再打印 A。

runBlocking {
        launch {
            delay(1000L)
            println("A")
        }
        runBlocking {
            Thread.sleep(3000L)
            println("B")
        }
    }

Thread.sleep() 确实阻塞了线程,线程被阻塞时无法打印A。

如果线程中的协程可以在线程被阻塞的情况下执行,那么使用runBlocking()阻塞线程是什么意思?

如果这段代码的行为与第一个相同,runBlocking() 和 coroutineScope() 有什么区别?

runBlocking {
        launch {
            delay(1000L)
            println("A")
        }
        coroutineScope {
            delay(3000L)
            println("B")
        }
    }

【问题讨论】:

  • “runBlocking() 和 coroutineScope() 有什么区别?”,runBlocking 是创建新协程的普通函数,coroutineScope 是创建新协程作用域的挂起函数。来自runBlocking docs:此函数不应在协程中使用。 它旨在将常规阻塞代码连接到以挂起样式编写的库,用于主函数和在测试中。,只是不要那样使用它。

标签: multithreading kotlin coroutine kotlin-coroutines


【解决方案1】:

使用 runBlocking 的整个想法是,当您需要在 runblocking 线程中的代码立即执行时,当您调用 runblocking 时:这意味着“阻塞直到该块内的任何内容完成”当您调用父 runblocking 它只会阻塞,直到你的代码被执行,但在 coroutinescope 的情况下,你总是可以将它映射到特定的线程模式。我建议你先把协程的基础搞清楚!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多