1 当启动几个任务不需要返回值的场景后,想要等它们全部完成后再继续,
fun main() {
//测试用于
runBlocking {
launch {
delay(1000)
println("协程1执行完成")
}
launch {
delay(3000)
println("协程3执行完成")
}
launch {
delay(1500)
println("协程2执行完成")
}
println("主线程继续执行")
}
// 作用域内的所有任务完成后才会继续,这里也就达到了等待多个异步任务都完成的效果
// 并且如果出现错误,抛出异常的同时,其他任务也会被终止。
println("所有协程完成后打印")
}
顺带一提,如果你不希望任务出现错误会终止其他任务,那么也可以选择使用 supervisorScope。
2 等待多个异步任务执行完成后拿到多个对应的结果,再对多个结果进行处理。
fun test1() {
lifecycleScope.launch {
println("准备执行开始")
val deferred1 = async(Dispatchers.IO) {
delay(1000);
println("协程1执行完成返回结果10")
10
}
val deferred3 = async(Dispatchers.IO) {
delay(3000);
println("协程3执行完成返回结果30")
30
}
val deferred2 = async(Dispatchers.IO) {
delay(2000);
println("协程2执行完成返回结果20")
20
}
asyncNum(deferred1.await(), deferred2.await(), deferred3.await())
}
}
private fun asyncNum(params0: Int, params1: Int, params2: Int) {
//执行业务逻辑
val result=params0+params1+params2
println("等待多个异步完成后结果再拿结果做业务逻辑获取的结果 $result")
}
3 多个任务串行执行。
private fun test2() {
lifecycleScope.launch {
println("任务开始")
val result1 = withContext(Dispatchers.IO) {
delay(1500) // 模拟耗时操作
"任务1完成"
}
println(result1)
val result2 = withContext(Dispatchers.IO) {
delay(2000) // 模拟耗时操作
"任务2完成"
}
println(result2)
println("所有任务完成")
}
}
或者用以下的代码也是可以的。
private fun test3() {
lifecycleScope.launch {
println("任务开始")
val result1 = async(Dispatchers.IO) {
delay(1500) // 模拟耗时操作
"任务1完成"
}.await()
println(result1)
val result2 = async(Dispatchers.IO) {
delay(2000) // 模拟耗时操作
"任务2完成"
}.await()
println(result2)
println("所有任务完成")
}
}