首页 > 解决方案 > 如果它阻塞当前线程,kotlin中的runBlocking有什么用?

问题描述

我目前正在开发一个runBlocking在很多地方使用的代码库。这是一个例子

fun doSomeComputation() {
    val rows = runBlocking { //suspend function which queries database }
    //rows is used for further computation
}

据我了解runBlocking阻塞当前线程。那么通过使用它而不是使用常规函数,我们到底得到了什么好处呢?读到我们使用异步代码的地方,这样线程就不会被阻塞并且 UI 不会变得无响应,但是runBlocking由于它阻塞了线程,所以如何使用异步代码?
我对 javascript 也有同样的疑问,async/await 既然线程被阻塞,为什么还要使用await

标签: kotlinasynchronousasync-awaitkotlin-coroutinesnonblocking

解决方案


这正是我们不应该runBlocking()像你一样使用的原因。runBlocking()对于启动我们的应用程序很有用,例如我们可以runBlocking()main()to bootstrap coroutines 中放置一个,然后我们不会在其他任何地方使用它。如果阻塞是我们的预期结果,那么桥接可挂起和不可挂起的代码也很有用。但除此之外,我们应该避免使用它。

如果我们需要桥接经典代码和可挂起代码,但又不想阻塞线程,那么我们需要坚持经典的异步技术,如期货或回调。


推荐阅读