协程,代码执行顺序(个人)

val result = doLongTask()

println(result)

又有两个情况,不太明白代码执行顺序。

 

1、「协程内部会阻塞」

suspend fun doLongTask(taskName: String, delayTime: Long): String {
    delay(delayTime)
    return "task $taskName is complete"
}

fun main(): Unit = runBlocking {
    println("run start")
    val job = launch {
        println("launch start")
        val result = doLongTask("A", 2000L)
        println(result) // 协程内部会阻塞,直到 doLongTask 返回结果
        println("launch end") // launch 协程会等待 doLongTask 返回结果,然后继续执行
    }
    // job.join() // 等待 job 协程执行完成
    println("run end")

}

2、「主协程在此挂起等待」

// "run协程"就是指 runBlocking 创建的协程环境
/*
runBlocking 块:整个 runBlocking { ... } 代码块就是所谓的"run协程"
主协程:这是协程执行的入口点,也称为主协程或根协程
阻塞特性:runBlocking 会阻塞当前线程直到其内部的所有协程都完成
 */
fun main(): Unit = runBlocking {
    println("start")
    val deferred1 = async {
        println("launch start")
        doLongTask("A", 2000L)
    }

    //await() 会挂起当前协程(runBlocking创建的主协程),等待 deferred1 协程返回结果
    //await() 调用会使主协程挂起(暂停执行)
    //挂起期间不会阻塞线程,而是让出控制权给其他协程
    //直到 deferred1 异步任务完成并返回结果后,主协程才会恢复执行
    val result = deferred1.await() // 主协程在此挂起等待
    println("result:$result") // 只有拿到结果后才执行此行
    // 等待机制:run协程会等待deferred1协程完成并返回结果后才会继续执行后续代码。
    // 同步控制:体现了协程间的等待和同步机制。
    println("end") // run 协程会等待 deferred1 协程返回结果,然后继续执行
}

 

posted @ 2026-01-09 15:55  touchmore  阅读(4)  评论(0)    收藏  举报