0
点赞
收藏
分享

微信扫一扫

Kotlin 协程的作用域构建器 coroutineScope与runBlocking 与supervisorScope,协程同步运行,协程挂掉的时候其他协程如何不被挂掉。协程里面有的执行 有的不执行


coroutineScope与runBlocking 区别

runBlocking 是常规函数,而 coroutineScope 是挂起函数

他们都会等待其协程体以及所有子协程结束,主要区别在于runBolocking方法会阻塞当前线程来等待。而coroutineScope只是挂起,会释放底层线程用于其他用途。


runBlocking 代码范例


binding.btClick7.setOnClickListener {
runBlocking {

val job1 = async {
delay(1000)
Log.e(TAG, "job1 finished")
throw IllegalArgumentException()

}


val job2 = async {
delay(2000)
Log.e(TAG, "job2 finished")
}

}
Log.e(TAG, "thread:A")
}

Kotlin 协程的作用域构建器 coroutineScope与runBlocking 与supervisorScope,协程同步运行,协程挂掉的时候其他协程如何不被挂掉。协程里面有的执行 有的不执行_kotlin

 app会闪退

那么换成coroutineScope 

runBlocking {
coroutineScope {
val job1 = async {
delay(1000)
Log.e(TAG, "job1 finished")
throw IllegalArgumentException()

}


val job2 = async {
delay(2000)
Log.e(TAG, "job2 finished")
}
}


}
Log.e(TAG, "thread:A")
}

 

Kotlin 协程的作用域构建器 coroutineScope与runBlocking 与supervisorScope,协程同步运行,协程挂掉的时候其他协程如何不被挂掉。协程里面有的执行 有的不执行_不执行_02

 app依然闪退。下面将会不执行。

那么如果想报错了以后其余的不影响,使用supervisorScope ,如何操作

binding.btClick7.setOnClickListener {
runBlocking {
supervisorScope {
val job1 = async {
delay(1000)
Log.e(TAG, "job1 finished")
throw IllegalArgumentException()

}


val job2 = async {
delay(2000)
Log.e(TAG, "job2 finished")
}
}


}
Log.e(TAG, "thread:A")
}

Kotlin 协程的作用域构建器 coroutineScope与runBlocking 与supervisorScope,协程同步运行,协程挂掉的时候其他协程如何不被挂掉。协程里面有的执行 有的不执行_开发语言_03

 coroutineScope 一个协程失败了。所有其他的协程会被取消掉

supervisorScope  一个协程失败了。不会影响其他的兄弟协程。

举报

相关推荐

0 条评论