我正在尝试学习Java/Kotlin中的协程和线程。据我所知,至少当你在线程中调用DB操作时,它会阻塞线程本身,并等待DB的响应来解锁它。另一方面,协程是“轻量级线程”,但从我的研究来看,它们只是线程中的“例程”。
那么,如果我在DB操作中使用协程,它是否也会阻塞线程,从而阻塞线程中运行的其他协程??
发布于 2019-08-21 06:42:36
是的,调用一个长时间运行的函数会阻塞正在运行协程的线程。
在您的示例中,如果您有一个长时间运行的db操作,则可以编写如下函数
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是多余的(集成开发环境会警告您这一点),所以代码将在启动它的任何线程中同步运行。
https://stackoverflow.com/questions/57581718
复制相似问题