阻塞協程構造器
適用於單元測試的場景,而業務開發中不會用到這種方法
調用了 runBlocking 的主線程會一直 阻塞 直到 runBlocking 內部的協程執行完畢。複製代碼
非阻塞協程構造器
生命週期受整個應用程序的生命週期限制,且不能取消複製代碼
非阻塞協程構造器
經過 context 參數去管理和控制協程的生命週期聲明本身做用域
它會建立一個協程做用域而且在全部已啓動子協程執行完畢以前不會結束複製代碼
在於後者在等待全部子協程執行完畢時不會阻塞當前線程。複製代碼
Error: Kotlin: Suspend functions are only allowed to be called from a coroutine or another
suspend function掛起函數,只能在協程中使用複製代碼
val job = launch {
repeat(1000) { i ->
println("job: I'm sleeping $i ...")
delay(500L)
}
}
job.cancel() // 取消該做業
job.join() // 等待做業執行結束
有一個能夠使 Job 掛起的函數 cancelAndJoin 它合併了對 cancel 以及 join 的調用複製代碼
withTimeout(1300L) {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
}
該函數會跑出TimeoutCancellationException 異常
複製代碼
能夠使用 withTimeoutOrNull代替,經過返回 null 來進行超時操做,從而替代拋出一個異常
bash
val result = withTimeoutOrNull(1300L) {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
"Done" // 在它運行獲得結果以前取消它
}
println("Result is $result")
複製代碼
待續函數