Kotlin-Coroutines中的async與await異步協(xié)程管理
Coroutines
什么是協(xié)程?(摘自官網(wǎng))
- Asynchronous or non-blocking programming is an important part of the development landscape. 用于異步或非阻塞 編程。
簡單概括
- 同步的方式去編寫異步執(zhí)行的代碼
- 協(xié)程依賴于線程
- 協(xié)程掛起時不需要阻塞線程,幾乎是無代價的.
- 一個線程中可以創(chuàng)建N個協(xié)程
協(xié)程的創(chuàng)建/啟動
- runBlocking 啟動一個新的協(xié)程并阻塞調(diào)用它的線程
- launch:Job 啟動一個協(xié)程但不會阻塞調(diào)用線程(CoroutineScope作用域內(nèi)調(diào)用)
- async:Deferred<T> 啟動一個協(xié)程但不會阻塞調(diào)用線程(CoroutineScope作用域內(nèi)調(diào)用)
協(xié)程作用域(CoroutineScope)
GlobalScope 全局頂級協(xié)程 (現(xiàn)在 GlobalScope 類已被 @DelicateCoroutinesApi 注解所標記) 全局范圍
啟動一個協(xié)程:

CoroutineScope https://developer.android.com/topic/libraries/architecture/coroutines
MainScope 主線程的作用域,全局范圍
lifecycleScope 生命周期范圍,用于activity等有生命周期的組件,DESTROYED結束。
class MyFragment: Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycleScope.launch {
val params = TextViewCompat.getTextMetricsParams(textView)
val precomputedText = withContext(Dispatchers.Default) {
PrecomputedTextCompat.create(longTextContent, params)
}
TextViewCompat.setPrecomputedText(textView, precomputedText)
}
}
}
- viewModelScope:viewModel范圍,ViewModel被回收時結束
class MyViewModel: ViewModel() {
init {
viewModelScope.launch {
// Coroutine that will be canceled when the ViewModel is cleared.
}
}
}
val user: LiveData<User> = liveData {
val data = database.loadUser() // loadUser is a suspend function.
emit(data)
}
異步、并發(fā)、并行
異步
- 是一種編程模型
- 獨立于主程序流事件的發(fā)生
- 異步啟動的操作,不會立即阻塞程序,并同時發(fā)生
異步是實現(xiàn)非阻塞和并發(fā)編程的編程模型
并發(fā)
- 獨立執(zhí)行任務的組合
- 所有任務的工作都可以以某種任意順序交錯
- 這些任務不一定必須同時執(zhí)行
它的主要目標是結構,而不是并行性
并行
- 同時執(zhí)行多個事物
- 與多個任務的執(zhí)行有關
并發(fā)就是一次處理很多事情,并行就是一次做很多事情
協(xié)程中的并發(fā)和并行
- 掛起而非阻塞 ,一個并發(fā)的例子
import kotlinx.coroutines.*
import kotlin.system.measureTimeMillis
fun main(args: Array<String>) =
runBlocking {
val time = measureTimeMillis {
val one = async { doSomethingUsefulOne() }
val two = async { doSomethingUsefulTwo() }
println("The answer is ${one.await()} ${two.await()}")
}
println("Completed in $time ms")
}
suspend fun doSomethingUsefulTwo() :Int{
delay(1000L)
println("two")
return 2
}
suspend fun doSomethingUsefulOne():Int {
delay(1000L)
println("one")
return 1
}結果
one
two
The answer is 1 2
Completed in 1020 ms
并行
- GlobalScope
- 指定協(xié)同調(diào)度程序
- 暫停阻塞
suspend fun doSomethingUsefulOne(): BigInteger = withContext(Dispatchers.Default) {
measureTimedValue {
println("in doSomethingUsefulOne")
BigInteger(1500, Random()).nextProbablePrime()
}
}.also {
println("Prime calculation took ${it.duration} ms")
}.value以上就是Kotlin-Coroutines中的async與await異步協(xié)程管理的詳細內(nèi)容,更多關于Kotlin Coroutines異步協(xié)程的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot application.yml 最全避坑與多環(huán)境配置
SpringBoot項目中,application.yml配置至關重要,涵蓋服務器端口、數(shù)據(jù)庫連接、第三方服務集成等配置,正確配置決定項目啟動與穩(wěn)定運行,本文詳細解析yml語法、多環(huán)境配置及敏感信息處理,助你高效編寫、規(guī)避常見問題2026-06-06
Java實現(xiàn)Excel數(shù)據(jù)驗證功能
在Java中,開發(fā)者可以使用一些開源的庫(如Apache POI)來添加、修改和處理Excel中的數(shù)據(jù),下面我們就來看看如何使用Java實現(xiàn)添加,修改和刪除Excel數(shù)據(jù)驗證吧2023-10-10
JavaWeb使用Session和Cookie實現(xiàn)登錄認證
本篇文章主要介紹了JavaWeb使用Session和Cookie實現(xiàn)登錄認證,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03
如何解決SpringBoot啟動時無法加載配置文件或環(huán)境變量問題
文章主要介紹了在Spring Boot項目中遇到配置文件加載失敗和資源目錄圖標異常的問題,并提供了詳細的解決步驟,解決方法包括在pom.xml文件中添加特定配置,確保資源目錄順序正確,以及注意節(jié)點的正確使用,通過這些步驟,可以有效解決資源加載問題,提高開發(fā)效率2024-12-12

