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

5

我正在学习使用 Kotlin 开发 Android,了解到在不阻塞主线程的情况下启动协程的推荐方式如下:

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

但我也在想,下面的调用不会阻塞主线程,因为它仍然使用Dispatchers.IO

runBlocking(Dispatchers.IO) {
  // Do IO work here
}
2个回答

13
如果你在主线程中调用 runBlocking(Dispatchers.IO),那么主线程将会被阻塞,直到协程在 IO 调度器上完成。
关于此,文档中的解释如下:
当 CoroutineDispatcher 明确指定在上下文中时,则新协程在指定调度程序的上下文中运行,而当前线程被阻塞。如果指定的调度程序是另一个 runBlocking 的事件循环,则此调用使用外部事件循环。
您可以在此处找到文档:https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html

调度程序通常不会导致实际切换到另一个线程。在这种情况下,底层实现会尽最大努力保持执行在同一线程上。 - Samsad CV
无论如何,从runBlocking的调用者的角度来看,主线程都被阻塞,无法使用。 - undefined

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接