【发布时间】:2022-02-17 05:37:13
【问题描述】:
我遇到了一个有趣的协程冻结,我将其简化为以下问题:
//running on main thread
runBlocking {
lifecycleScope.launch {
delay(1000)
}.join()
}
这会导致主线程无限期地冻结。我认为这是因为以下一系列事件:
- 要启动的队列
- 调用加入,将主线程传递给协程池
- 调用启动
- 调用延迟,将主线程传递给协程池
- 线程移回加入并等待
- 延迟永远不会结束,因为它没有可用的线程?
如果我对上述逻辑有误解,请纠正我。避免这种情况发生的合理模式是什么?我知道在主线程上运行阻塞不是一个好主意,但是在代码的更深层次上,您会以这种方式意外冻结单线程协程似乎很奇怪。
【问题讨论】:
-
使用
runBlocking会意外死锁线程并不奇怪。奇怪的是使用runBlocking。除了 JVM 应用程序的main()函数之外,它的用例非常狭窄。 -
@Tenfour04 这似乎是一个合理的答案,但对我来说仍然很奇怪,这最终会在某个地方保留主线程
-
为什么你觉得奇怪?甚至
runBlocking()函数的名称都表示它阻塞了线程。
标签: android kotlin kotlin-coroutines