coroutineScope 與 runBlocking
- runBlocking 是常規(guī)函數(shù)狡汉,而coroutineScope 是掛起函數(shù)
2.它們都會(huì)等待期協(xié)程體以及所有子協(xié)程結(jié)束响禽,主要區(qū)別在于runBlocking 方法會(huì)阻塞當(dāng)前線程來等待,而coroutineScope 只是掛起,會(huì)釋放底層線程用于其他用途
coroutineScope 與supervisorScope
1.coroutineScope :一個(gè)協(xié)程失敗了,所有其他兄弟協(xié)程也會(huì)被取消
2.supervisorScope:一個(gè)協(xié)程失敗了,不會(huì)影響其他協(xié)程
coroutineScope :
val b = runBlocking {
coroutineScope {
val job1 = async {
delay(1000)
println("job1 finished")
}
val job2 = async {
delay(500)
println("job2 finished")
}
}
執(zhí)行輸出內(nèi)容:
7905-7905 I/System.out: job2 finished
7905-7905 I/System.out: job1 finished
如果在執(zhí)行過程中job2 出現(xiàn)異常協(xié)程被取消退敦,那么job1的執(zhí)行將會(huì)被取消
val b = runBlocking {
coroutineScope {
val job1 = async {
delay(1000)
println("job1 finished")
}
val job2 = async {
delay(500)
println("job2 finished")
throw IllegalArgumentException()
}
}
執(zhí)行結(jié)果:
8670-8670 I/System.out: job2 finished
supervisorScope:
val b = runBlocking {
supervisorScope {
val job1 = async {
delay(1000)
println("job1 finished")
}
val job2 = async {
delay(500)
println("job2 finished")
throw IllegalArgumentException()
}
}
輸出結(jié)果:
10776-10776 I/System.out: job2 finished
10776-10776 I/System.out: job1 finished