2. 等待协程完成

任务说明

在Kotlin协程中,launch启动的协程默认是并发的,主线程不会自动等待其完成。本案例要求使用join()函数挂起当前协程,直到目标子协程执行完毕,从而确保主流程在子协程结束后再继续。

核心实现

import kotlinx.coroutines.*

fun main() = runBlocking {
    // 启动一个子协程,模拟耗时任务
    val job = launch {
        repeat(3) { index ->
            delay(500)  // 模拟耗时操作
            println("子协程执行中: ${index + 1}/3")
        }
        println("子协程执行完毕")
    }

    println("主线程:等待子协程完成...")
    job.join()  // 挂起主协程,直到子协程结束
    println("主线程:子协程已结束,继续执行")
}

代码说明

runBlocking创建主协程作用域,launch启动子协程并返回Job对象。调用job.join()后,主协程会挂起等待,直到子协程全部执行完成(包括repeat循环和最后的打印语句)。若去掉join(),主协程会立即执行到最后一行,子协程可能尚未完成。

执行流程

主线程:等待子协程完成...
子协程执行中: 1/3
子协程执行中: 2/3
子协程执行中: 3/3
子协程执行完毕
主线程:子协程已结束,继续执行

验证方式

直接运行上述代码,观察输出顺序。若join()生效,最后一行“主线程:子协程已结束”必然在“子协程执行完毕”之后打印;若注释掉job.join()再运行,最后一行会提前到最前面输出,由此可验证join()的等待效果。

join() 等待时序 主协程 子协程 println("等待...") job.join() 挂起 repeat(3) 循环 delay(500) × 3 println("执行完毕") ✓ 协程完成,恢复执行 println("已结束") t0 t1 t2

关键点

  • join()是Job的挂起函数,只能在协程或挂起函数中调用
  • 等待期间主协程不阻塞线程,而是让出执行权
  • 若子协程已执行完毕,join()会立即返回