簡體   English   中英

執行DB操作時Kotlin協程或任何協程是否會阻塞線程?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM