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 秒。
- “协程启动”所在线程名与主线程名不同(通常为协程调度线程),说明协程确实在独立线程上执行。
预期输出
主线程开始: main
协程启动: DefaultDispatcher-worker-1
主线程结束: main
协程结束: DefaultDispatcher-worker-1
注意:协程线程名可能因调度器不同而略有差异,但“协程启动”与“协程结束”所在线程一致,且与主线程不同。以上输出为基于代码逻辑的确定性预期,实际运行结果以你的环境为准。