java - Kotlin 协程或任何协程在执行 DB 操作时是否会阻塞线程?

标签 java multithreading kotlin coroutine kotlin-coroutines

我正在尝试学习 Java/Kotlin 中的协程与线程。根据我的理解,至少当您在线程内调用数据库操作时,它会阻塞线程本身并等待数据库的响应以将其解锁。另一方面,协程是“轻量级线程”,但根据我的研究,它们只是线程内的“例程”。

因此,如果我将协程与数据库操作一起使用,它是否也会阻塞线程,从而在线程内运行的其他协程将被阻塞?

最佳答案

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

在您的示例中,如果您有一个长时间运行的数据库操作,您可以编写这样的函数

suspend fun writeToDb(data: Data) = withContext(Dispatchers.IO) {
    // write data to db here
    // return result
}

你可以像这样从 UI 线程安全地调用它

scope.launch(Dispatchers.main) {
    val result = writeToDb(data)
    if (result == success) {
         // todo
    }
}

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

suspend fun dontDoThis() {
    timeConsumingFunction()
}

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

timeConsumingFunction 中没有任何暂停,因此 dontDoThis 中修改的 suspend 是多余的(IDE 会警告您这一点),因此代码将在启动的任何线程中同步运行。

关于java - Kotlin 协程或任何协程在执行 DB 操作时是否会阻塞线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57581718/

相关文章:

python - 在参数列表上线程化

java - Android:目标SIM卡/来电号码

java - 如何从 JSON 响应中提取 boolean 值?

java - 与 java 线程不一致的结果

kotlin - 如何为 Kotlin 实现 applyif?

android - 在 Android Java 应用程序中使用 Kotlin AAR 时出现 java.lang.NoClassDefFoundError

android - kotlin android 启动新服务

java - 如何为短信捕获器注册BroadcastReceiver?

java - 如果 Var args 方法也存在并且重载方法存在于 Java 方法中,会发生什么情况

android - 在不同的 GLSurfaceView 之间共享 GLES20 上下文和纹理?