【问题标题】:Does Kotlin Coroutines or any coroutine block the thread when performing DB operation?Kotlin Coroutines 或任何协程在执行 DB 操作时是否会阻塞线程?
【发布时间】:2019-12-26 03:32:50
【问题描述】:

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

所以如果我使用带有数据库操作的协程,它是否会阻塞线程,因此线程内运行的其他协程将被阻塞??

【问题讨论】:

    标签: java multithreading kotlin coroutine kotlin-coroutines


    【解决方案1】:

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

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

    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 不会自动使其变为非阻塞。例如,如果你有这样的东西

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 2020-05-21
      相关资源
      最近更新 更多