首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行DB操作时,Kotlin协程或任何协程是否会阻塞线程?

执行DB操作时,Kotlin协程或任何协程是否会阻塞线程?
EN

Stack Overflow用户
提问于 2019-08-21 05:25:53
回答 1查看 270关注 0票数 0

我正在尝试学习Java/Kotlin中的协程和线程。据我所知,至少当你在线程中调用DB操作时,它会阻塞线程本身,并等待DB的响应来解锁它。另一方面,协程是“轻量级线程”,但从我的研究来看,它们只是线程中的“例程”。

那么,如果我在DB操作中使用协程,它是否也会阻塞线程,从而阻塞线程中运行的其他协程??

EN

回答 1

Stack Overflow用户

发布于 2019-08-21 06:42:36

是的,调用一个长时间运行的函数会阻塞正在运行协程的线程。

在您的示例中,如果您有一个长时间运行的db操作,则可以编写如下函数

代码语言:javascript
复制
suspend fun writeToDb(data: Data) = withContext(Dispatchers.IO) {
    // write data to db here
    // return result
}

您可以安全地从UI线程调用它,如下所示

代码语言:javascript
复制
scope.launch(Dispatchers.main) {
    val result = writeToDb(data)
    if (result == success) {
         // todo
    }
}

将函数设为suspend并不会自动使其成为非阻塞的。例如,如果你有这样的东西

代码语言:javascript
复制
suspend fun dontDoThis() {
    timeConsumingFunction()
}

fun timeConsumingFunction() {
    // execute long running operation in current thread
}

timeConsumingFunction中没有挂起任何东西,所以在dontDoThis中修改的suspend是多余的(集成开发环境会警告您这一点),所以代码将在启动它的任何线程中同步运行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57581718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档