kotlin协程async与await

kotlin协程async与await

import kotlinx.coroutines.*
import kotlin.system.measureTimeMillis

fun main() {
    val time = measureTimeMillis {
        runBlocking {
            /**
             * async 是 CoroutineScope 扩展函数,async 和 launch 的区别在于async 可以返回协程结果,而 launch 不能。
             * async默认值 CoroutineStart.DEFAULT 协程在声明同时就被启动(实际上还需被调度执行,但可认为是立即就执行)
             * CoroutineStart.LAZY 不主动启动协程,直到主动调用async.await()或async.satrt()后才启动(懒加载模式)
             * a.await() + b.await()导致两个协程顺序执行
             */

            val a = async(start = CoroutineStart.LAZY) {
                delay(2000)
                1
            }

            val b = async(start = CoroutineStart.LAZY) {
                delay(3000)
                2
            }

            /* 打破CoroutineStart.LAZY懒加载,协程立即投入执行。
            a.start()
            b.start()
             */
            println(a.await() + b.await())
        }
    }

    println(time)
}

输出:

3
3072

https://zhangphil.blog.csdn.net/article/details/129265638https://zhangphil.blog.csdn.net/article/details/129265638

kotlin协程、线程切换,函数方法委托_zhangphil的博客-CSDN博客runBlocking 内部启动的3个协程做耗时操作,从输出可以看到3个协程交叉并发执行,runBlocking 会等到3个协程执行结束后才退出,输出结果有明确先后顺序。一般编程的技法,比如,在Android中,假设在主线程中实现了一个函数,但该函数是耗时操作,毫无疑问,需要将这个函数的实现切入非主线程中操作,那么可以设计一种托管的函数,在托管的函数里面干脏活,处理完成后,把结果抛到主线程。结果1-a: 5 - tid:22。结果1-b: 5 - tid:24。结果2-a: 9 - tid:22。https://blog.csdn.net/zhangphil/article/details/130161705

https://zhangphil.blog.csdn.net/article/details/129250518https://zhangphil.blog.csdn.net/article/details/129250518

猜你喜欢

转载自blog.csdn.net/zhangphil/article/details/129268399