[英]kotlin 1.3 coroutine usage leads to ClassNotFoundException: kotlinx.coroutines.BuildersKt
[英]Does Kotlin Coroutines or any coroutine block the thread when performing DB operation?
我正在嘗試在Java / Kotlin中學習協程與線程。 據我了解,至少當您在線程內調用數據庫操作時,它會阻塞線程本身,並等待數據庫的響應才能將其解鎖。 另一方面,協程是“輕量級線程”,但根據我的研究,它們只是線程內的“例程”。
因此,如果我將協程與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
,故suspend
在修改dontDoThis
是多余的(和IDE會警告你這個問題),所以代碼將同步在任何一個線程它開始運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.