即使协程上下文不是 Dispatchers.Main,runBlocking(Dispatchers.IO) 是否会阻塞主线程?

Dav*_*its 1 android kotlin kotlin-coroutines

我正在使用 Kotlin 学习 Android,并且我了解到在不阻塞主线程的情况下启动协程的推荐方法是执行以下操作

MainScope().launch {
  withContext(Dispatchers.IO) {
    // Do IO work here
  }
}

Run Code Online (Sandbox Code Playgroud)

但我也想知道,如果调用下面不是因为它仍然使用会阻塞主线程Dispatchers.IO

runBlocking(Dispatchers.IO) {
  // Do IO work here
}
Run Code Online (Sandbox Code Playgroud)

mar*_*ran 6

如果你打电话 runBlocking(Dispatchers.IO)从主线程,那么主线程将被阻塞,而协程在 IO 调度程序上完成。

这是文档对此的说明:

当在上下文中明确指定 CoroutineDispatcher 时,新的协程会在当前线程被阻塞的同时在指定的调度程序的上下文中运行。如果指定的调度程序是另一个 runBlocking 的事件循环,则此调用使用外部事件循环。

您可以在此处找到文档:https : //kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html