Android中使用Kotlin开发时,总会遇到这几个词:进程(Process)、线程(Thread)和协程(Coroutine),今天简单记录一下相关内容,记录于此,方便自己查阅。
正文
进程和线程定义之前介绍过,这里之介绍协程。
协程(Coroutine)是一种用户态的轻量级并发执行单元,也被称为“微线程”或“纤程”。
协程是一段可以主动“挂起”和“恢复”执行的函数。
它的本质是运行在Kotlin线程之上的一种轻量级任务封装框架。
为什么极力推荐协程?
解决“回调地狱”:传统多线程处理复杂网络请求时,代码往往支离破碎。协程允许我们用同步的顺序代码来写异步逻辑,代码可读性极高。
极高的并发性能:创建一个 Java 线程大约需要 1MB 内存,创建几千个线程就会导致内存溢出(OOM)。而协程极其轻量(仅占几百字节),你可以轻松在单个线程内创建 10万个协程 而毫无压力。
结构化并发与生命周期绑定:在 Android 中,使用
lifecycleScope或viewModelScope启动协程,当 Activity/Fragment 销毁时,协程会自动取消,彻底告别内存泄漏和任务泄漏。
如何切换线程的?
在 Kotlin 中,协程通过 Dispatchers(调度器)来切换线程,其底层依然是线程池:
Dispatchers.Main:绑定 Android 主线程(底层是 Handler),用于更新 UI。Dispatchers.IO:底层是弹性伸缩的线程池,专为网络请求、文件读写等阻塞 IO 优化。Dispatchers.Default:底层是固定核心数的线程池,专为 CPU 密集型任务(如 JSON 解析、排序)优化。
典型代码示例:
viewModelScope.launch(Dispatchers.Main) {
// 1. 在主线程显示 Loading
showLoading()
// 2. 挂起并切换到 IO 线程执行耗时操作,主线程被释放,UI 不会卡顿
val result = withContext(Dispatchers.IO) {
repository.fetchDataFromNetwork()
}
// 3. 自动切回主线程,安全地刷新 UI
updateUI(result)
}三者关系
要了解进程、线程和协程三者之间的关系,可以用“公交车与乘客”例子来比喻:
进程:相当于公交公司,拥有独立的场站、车辆和资产(独立的内存空间和系统资源)
线程:相当于公交车,是真正在路上跑、干活的执行者(CPU调度的最小单位)
协程:相当于乘客,是坐在公交车上的任务。一辆公交车(线程)上可以同时搭载成百上千个乘客(协程)
三者是属于包含关系:
进程 (Process) ➔ 包含 ➔ 线程 (Thread) ➔ 包含 ➔ 协程 (Coroutine)
在Android中(以Android为例)
一个应用在启动时,系统会为其分配一个独立的 Linux 进程(Process)
一个进程中至少包含一个主线程(Main Thread / UI Thread),也可以根据需要开启多个后台线程
一个线程内部可同时并发运行多个 Kotlin 协程(Coroutine)
三者区别
| 维度 | 进程 (Process) | 线程 (Thread) | 协程 (Coroutine) |
|---|---|---|---|
| 定义与级别 | 操作系统资源分配的基本单位 | 操作系统 CPU 调度的最小单位 | 语言级(用户态)的轻量级线程 |
| 内存与资源 | 拥有独立的内存地址空间和系统资源 | 共享所属进程的内存空间 | 共享所属线程的内存空间 |
| 创建与切换开销 | 极大(涉及内存分配、页表切换等) | 较大(需进入系统内核态,保存寄存器状态) | 极小(纯内存操作,基于状态机流转,无需OS介入) |
| 阻塞机制 | 独立运行,互不干扰 | 阻塞式(遇到耗时操作如网络请求,整辆车原地死等) | 非阻塞挂起(遇到耗时操作,乘客主动下车,把车让给别人) |
| 调度者 | 操作系统内核 | 操作系统内核 | 应用程序自身(Kotlin 调度器 Dispatchers) |
小结
在 Android 开发中:进程是应用的运行容器,线程是底层真正执行任务的载体,而 Kotlin 协程 则是架设在线程之上的“高级调度框架”。日常业务开发中,应优先使用协程来处理异步任务,将底层的线程管理交给框架,从而写出更安全、更优雅的代码。
参考文章
AI优化

