【问题标题】: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 会警告您这一点),因此代码将在启动的任何线程中同步运行。