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")
        }
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")
        } 

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")
        }
coroutineScope 一个协程失败了。所有其他的协程会被取消掉
supervisorScope 一个协程失败了。不会影响其他的兄弟协程。










