Kotlin中的并发与多线程简介
现代应用程序越来越需要同时执行多个任务——从处理网络请求到操作数据库。在Kotlin语言中(该语言广泛用于Android开发、服务器端应用(Ktor、Spring)甚至桌面解决方案),实现了强大的并发与多线程工具。
本文将解析关键概念:传统线程(Threads)、协程(Coroutines)——Kotlin中异步编程的现代方法,以及同步机制。您将了解何时使用线程,何时使用协程,并获得现成的代码示例。
1. Kotlin中的传统线程(Threads)
Kotlin与Java完全兼容,因此您可以使用标准的Thread和Runnable类。但Kotlin添加了语法糖,使代码更加简洁。
创建和启动线程
创建线程的基本方法是将lambda表达式传递给Thread构造函数:
fun main() { val thread = Thread { println("线程已启动: ${Thread.currentThread().name}") for (i in 1..5) { println("计数: $i") Thread.sleep(500) } } thread.start() println("主线程继续执行") thread.join() // 等待线程结束 println("主线程已完成")}在这个例子中,我们创建了一个线程,以500毫秒的延迟输出数字1到5。join()方法使主线程等待子线程完成。
线程的问题
- 高资源消耗——每个线程都需要独立的栈内存(通常为1MB)。
- 同步复杂性——处理共享数据时容易发生竞态条件(race condition)。
- 数量有限——在单个设备上无法启动数万个线程而不损失性能。
正因如此,Kotlin引入了协程——一种更轻量的替代方案。
2. 协程(Coroutines)——Kotlin中的现代并发
协程是轻量级线程,可以在不阻塞系统线程的情况下暂停执行。它们是Kotlin中异步编程的主要工具。
添加协程依赖
要使用协程,需要在build.gradle.kts中添加依赖:
dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")}协程基础示例
import kotlinx.coroutines.*
fun main() = runBlocking { println("在线程中开始工作: ${Thread.currentThread().name}")
launch { // 启动新协程 delay(1000) // 非阻塞延迟 println("协程: ${Thread.currentThread().name}") }
println("主协程继续执行") delay(2000) // 等待子协程完成 println("结束")}关键点:
runBlocking——普通代码与协程之间的桥梁(阻塞当前线程)。launch——启动不返回结果的协程。delay——非阻塞延迟,与Thread.sleep()不同。
使用Async和Await获取结果
如果协程需要返回值,请使用async:
fun main() = runBlocking { val deferred1 = async { delay(1000) "结果 1" } val deferred2 = async { delay(500) "结果 2" }
println("等待结果...") val result1 = deferred1.await() val result2