协程,代码执行顺序(个人)
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 协程返回结果,然后继续执行 }

浙公网安备 33010602011771号