Kotlin中的并发与多线程:完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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

博客

书籍推荐