前言

Android中使用Kotlin开发时,总会遇到这几个词:进程(Process)线程(Thread)协程(Coroutine),今天简单记录一下相关内容,记录于此,方便自己查阅。

正文

进程和线程定义之前介绍过,这里之介绍协程。

协程

协程(Coroutine)是一种用户态的轻量级并发执行单元,也被称为“微线程”或“纤程”。

协程是一段可以主动“挂起”和“恢复”执行的函数。

它的本质是运行在Kotlin线程之上的一种轻量级任务封装框架

为什么极力推荐协程?
  1. 解决“回调地狱”:传统多线程处理复杂网络请求时,代码往往支离破碎。协程允许我们用同步的顺序代码来写异步逻辑,代码可读性极高。

  2. 极高的并发性能:创建一个 Java 线程大约需要 1MB 内存,创建几千个线程就会导致内存溢出(OOM)。而协程极其轻量(仅占几百字节),你可以轻松在单个线程内创建 10万个协程 而毫无压力。

  3. 结构化并发与生命周期绑定:在 Android 中,使用 lifecycleScopeviewModelScope 启动协程,当 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 协程 则是架设在线程之上的“高级调度框架”。日常业务开发中,应优先使用协程来处理异步任务,将底层的线程管理交给框架,从而写出更安全、更优雅的代码。

参考文章

  1. AI优化

  2. Kotlin等书籍

相关文章

笔友城堡 - 可定义的个人主页

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...