Android面试题之Kotlin中如何实现串行和并行任务

32 阅读2分钟

1 当启动几个任务不需要返回值的场景后,想要等它们全部完成后再继续,

fun main() {
    //测试用于
    runBlocking {
        launch {
            delay(1000)
            println("协程1执行完成")
        }
        launch {
            delay(3000)
            println("协程3执行完成")
        }
        launch {
            delay(1500)
            println("协程2执行完成")
        }
        println("主线程继续执行")
    }
    // 作用域内的所有任务完成后才会继续,这里也就达到了等待多个异步任务都完成的效果
    // 并且如果出现错误,抛出异常的同时,其他任务也会被终止。
    println("所有协程完成后打印")
}

顺带一提,如果你不希望任务出现错误会终止其他任务,那么也可以选择使用 supervisorScope

image.png

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

image.png

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("所有任务完成")
    }
}

image.png

或者用以下的代码也是可以的。

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("所有任务完成")
    }
}

image.png