1. 启动第一个协程

启动第一个协程 学习卡片

任务说明

本案例目标:使用 GlobalScope.launch 启动一个协程,在协程内打印一条日志,从而理解协程的基本启动方式与代码结构。你不需要处理线程切换、取消或异常,只需完成“启动协程并输出日志”这一最小闭环。

实现代码

import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

fun main() {
    println("主线程开始: ${Thread.currentThread().name}")

    // 使用 GlobalScope.launch 启动一个协程
    GlobalScope.launch {
        println("协程启动: ${Thread.currentThread().name}")
        delay(1000) // 挂起 1 秒,模拟耗时操作
        println("协程结束: ${Thread.currentThread().name}")
    }

    println("主线程结束: ${Thread.currentThread().name}")

    // 阻塞主线程 2 秒,等待协程执行完成
    Thread.sleep(2000)
}

代码说明

  • GlobalScope.launch { ... } 在应用全局作用域中启动一个新协程,协程体默认运行在后台线程池。
  • delay(1000) 是协程的挂起函数,挂起当前协程但不阻塞所在线程,1 秒后恢复执行。
  • 主线程通过 Thread.sleep(2000) 阻塞等待,确保协程在 main 函数退出前完成执行。

运行方式与依赖

这是一个 Kotlin/JVM 项目。需要添加协程核心库依赖:

// Gradle (build.gradle.kts)
dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
}

将上述代码保存为 Main.kt,在包含依赖的项目中直接运行 main() 函数即可。

验证方法与判定标准

运行程序后,观察控制台输出。满足以下条件即判定通过:

  • 输出中依次出现“主线程开始”“协程启动”“主线程结束”“协程结束”四行日志。
  • “协程启动”与“协程结束”之间的时间间隔约为 1 秒。
  • “协程启动”所在线程名与主线程名不同(通常为协程调度线程),说明协程确实在独立线程上执行。
GlobalScope.launch 协程执行时序 主线程 协程线程 println("主线程开始") launch println("协程启动") println("主线程结束") Thread.sleep(2000) delay(1000) 挂起 println("协程结束") 主线程不阻塞,协程在独立线程上执行 delay 挂起

预期输出

主线程开始: main
协程启动: DefaultDispatcher-worker-1
主线程结束: main
协程结束: DefaultDispatcher-worker-1

注意:协程线程名可能因调度器不同而略有差异,但“协程启动”与“协程结束”所在线程一致,且与主线程不同。以上输出为基于代码逻辑的确定性预期,实际运行结果以你的环境为准。