kotlin - 如果它阻塞当前线程,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
?
解决方案
这正是我们不应该runBlocking()
像你一样使用的原因。runBlocking()
对于启动我们的应用程序很有用,例如我们可以runBlocking()
在main()
to bootstrap coroutines 中放置一个,然后我们不会在其他任何地方使用它。如果阻塞是我们的预期结果,那么桥接可挂起和不可挂起的代码也很有用。但除此之外,我们应该避免使用它。
如果我们需要桥接经典代码和可挂起代码,但又不想阻塞线程,那么我们需要坚持经典的异步技术,如期货或回调。
推荐阅读
- android - 如何在片段中的导航抽屉中添加微调器
- c++ - noexcept 交换和移动具有互斥锁的类
- php - Wordpress - 自定义管理面板链接
- sharepoint - Powerapps如何提交引用另一个共享点列表的表单?
- c - 使用 NVIDIA 的 OpenCL SDK 编译 clinfo 会导致错误 C2061: syntax error: identifier 'cl_device_affinity_domain'
- python - python中的数据类型unit8
- pytorch - 如何在 pytorch 中正确使用 CTC Loss 和 GRU?
- angular8 - 如何从 ng-select2 的搜索输入框中获取值?
- django - Vue js下载的excel文件损坏
- linux - gpg: 没有找到有效的 OpenPGP 数据。在 Linux Lite 上的 Docker 上安装 Cassandra 时