我正在尝试学习 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/