Kotlin 协程这东西,很多人第一次接触时觉得「不就是把回调写成顺序代码」,写几个 launch、async 就以为掌握了。真到项目里出现取消不生效、异常被吞、结构化并发对不上、Dispatchers 切换后状态串了,才发现自己缺的不是语法,是一整套关于作用域、调度、异常传播的心智模型。这门课要补的就是这块缺口。

先确认你缺的是哪一层

协程的坑不在于难写,而在于错得安静。可以先用下面几条自查,命中两条以上,说明你需要系统过一遍而不是零散查资料:

  • 写得出 suspend 函数,但说不清它挂起时到底发生了什么、为什么它不能随便被普通函数调用;
  • 用过 CoroutineScope 和 GlobalScope,但判断不了什么时候该用哪个,也不知道为什么后者常被批评;
  • 知道 Dispatchers.IO 和 Default 有区别,但对「什么时候会切线程、切完回来的代价」没概念;
  • 遇到 Job、SupervisorJob、coroutineScope、supervisorScope 就靠试,试对了就过;
  • 异常处理停在 try/catch,没想过 CoroutineExceptionHandler 为什么有时根本进不来。

如果你的日常是 Android 开发、后台服务,或者只是在做异步任务编排,上面这些都会直接变成线上问题,而不是「面试题」。

这门课的组织方式

内容从基础实践切入,再往底层原理和工程化走,到进阶与专家部分。它不绕开协程最容易被敷衍的那几块:挂起的本质、结构化并发的父子关系、取消的传播与协作、异常的传播路径、调度器与线程模型。这些不是独立知识点,后面写 Channel、Flow、并发安全时全都要反复用到,所以基础段值得慢下来。

进阶段会把前面拆散的概念重新拼起来,让你在真实场景里判断「这里该用哪种作用域、这个取消应该在哪一层响应、这个异常该不该往上冒」。到了专家部分,重点从「会写」转向「写对、写稳、能定位问题」——比如怎么排查一个卡住不退出的协程、怎么在并发下保住共享状态。

怎么练才不算白学

协程光看不写没有用,因为它的错误几乎都藏在运行时行为里。学习时每过两三节,动手做一件事:写一段能复现问题的代码,再写一段修好它的代码,并在注释里写清「原来错在哪、为什么这样改」。比如自己造一个「取消后资源没释放」的例子,再让它正确响应取消;或者构造两个协程同时改一个变量,先看到错的结果,再用合适的手段纠正。

配套笔记适合在复盘时用:先自己回忆这块在讲什么、边界条件在哪,再对照笔记查漏。临面试前翻笔记也比重看视频高效。等基础段过完,试着独立复现一个完整的小 Demo——不照抄,自己搭结构、自己决定作用域怎么划分,把它当作能力证明放进作品集,比列一堆 API 名字更有说服力。

看完应该能回答这些问题

  • 一个 suspend 函数在挂起和恢复时,线程和调用栈分别发生了什么?
  • 父作用域取消时,子协程为什么也会被取消?如果不想这样,该怎么做?
  • 协程里抛出的异常会沿什么路径传播?什么情况下 try/catch 抓不到?
  • Dispatchers.IO 和 Default 的选择依据是什么,切线程的代价体现在哪?
  • 并发修改共享状态时,有哪些手段,各自适用什么场景?

能把这些用自己的话讲清楚,说明你不是「会调 API」,而是真的理解了协程的运行方式。这才是这门课想让你达到的位置。


Kotlin协程完全教程-从基础实践到进阶再到专家

课程推荐

《扔物线 Kotlin协程完全教程-从基础实践到进阶再到专家》Kotlin协程完全教程-从基础实践到进阶再到专家【技能收获】学完可掌握:核心实战技能、项目驱动学习。课程以实战为导向,覆盖从基础概念到完整项目落地的关键步骤,配套章节笔记便于课后复盘与面试前快速回顾。【学习建议】建议按目录顺序学习,先打基础再进入综合实战章节;每完成 2~3 节可结合笔记整理一份学习小结,最终尝试独立复现一套完整 Demo 写入个人作品集。【就业发展】可面向岗位:Linux 运维工程师、SRE、云计算工程师、DevOps 工程师。云原生与自动化运维仍是企业 IT 刚需方向,认证 + 实战项目组合能显著提升面试通过率,适合向中高级运维或架构岗进阶。 若你已有一定编程或运维基础,本课程可帮助你在现有技能栈上快速叠加热门方向能力,提升求职时的项目说服力与薪资谈判空间。

视频目录(69 节)

*   ├── 001.0-先导视频_( www.365exe.com ).mp4

*   ├── 002.1.0-学协程有用吗_( www.365exe.com ).mp4

*   ├── 003.1.1-切线程:launch()( www.365exe.com ).mp4

*   ├── 004.1.2-自动切回来:挂起函数( www.365exe.com ).mp4

*   ├── 005.1.3-Android 项目里协程代码的写法_( www.365exe.com ).mp4

*   ├── 006.1.4-withContext():手动切线程( www.365exe.com ).mp4

*   ├── 007.1.5-自定义挂起函数( www.365exe.com ).mp4

*   ├── 008.1.6-挂起函数的性能优势:从 withContext()( www.365exe.com ).mp4

*   ├── 009.1.7-消除魔法:挂起函数为什么不卡线程?( www.365exe.com ).mp4

*   ├── 010.1.8-「轻量级线程」的本质:从 delay() 说起( www.365exe.com ).mp4

*   ├── 011.1.9-结构化并发初探( www.365exe.com ).mp4

*   ├── 012.1.10-并行协程的启动和交互( www.365exe.com ).mp4

*   ├── 013.1.11-连接线程世界:和回调型 API 协作_( www.365exe.com ).mp4

*   ├── 014.1.12-回到线程世界:runBlocking()( www.365exe.com ).mp4

*   ├── 015.2.1-概念落地:「一个协程」到底指的是什么( www.365exe.com ).mp4

*   ├── 016.2.2-父子协程,以及协程间的并行和等待( www.365exe.com ).mp4

*   ├── 017.2.3-线程的强制结束:stop()( www.365exe.com ).mp4

*   ├── 018.2.4-线程的交互式结束:interrupt()( www.365exe.com ).mp4

*   ├── 019.2.5-协程的交互式取消:cancel()( www.365exe.com ).mp4

*   ├── 020.2.6-协程的结构化取消( www.365exe.com ).mp4

*   ├── 021.2.7-不配合取消:NonCancellable( www.365exe.com ).mp4

*   ├── 022.2.8-协程的结构化异常管理( www.365exe.com ).mp4

*   ├── 023.2.9-Coroutine Exception Handle( www.365exe.com ).mp4

*   ├── 024.2.10-异常的结构化管理的本质( www.365exe.com ).mp4

*   ├── 025.2.11-async() 对异常的处理_( www.365exe.com ).mp4

*   ├── 026.2.12-Supervisor Job( www.365exe.com ).mp4

*   ├── 027.3.1-Coroutine Scope _ -Context( www.365exe.com ).mp4

*   ├── 028.3.2-GlobalScope( www.365exe.com ).mp4

*   ├── 029.3.3-从挂起函数里获取 Coroutine Context( www.365exe.com ).mp4

*   ├── 030.3.4-coroutine Scope() 和 superv( www.365exe.com ).mp4

*   ├── 031.3.5-再谈 withContext()( www.365exe.com ).mp4

*   ├── 032.3.6-Coroutine Name( www.365exe.com ).mp4

*   ├── 033.3.7-Coroutine Context的加减和get()( www.365exe.com ).mp4

*   ├── 034.3.8-自定义 Coroutine Context( www.365exe.com ).mp4

*   ├── 035.4.1-Channel 和 Flow 简介与对比( www.365exe.com ).mp4

*   ├── 036.4.2-用 produce() 来提供跨协程的事件流( www.365exe.com ).mp4

*   ├── 037.4.3-Channel 的工作模式详解( www.365exe.com ).mp4

*   ├── 038.4.4-Channel API 详解( www.365exe.com ).mp4

*   ├── 039.4.5-actor():把 SendChannel 暴露出来( www.365exe.com ).mp4

*   ├── 040.4.6-Flow 的功能定位( www.365exe.com ).mp4

*   ├── 041.4.7-Flow 的工作原理和应用场景_( www.365exe.com ).mp4

*   ├── 042.4.8-Flow 的创建( www.365exe.com ).mp4

*   ├── 043.4.9-Flow 的收集( www.365exe.com ).mp4

*   ├── 044.4.10-filter() 系列操作符( www.365exe.com ).mp4

*   ├── 045.4.11-distinct UntilChanged()( www.365exe.com ).mp4

*   ├── 046.4.12-自定义 Flow 操作符( www.365exe.com ).mp4

*   ├── 047.4.13-timeout、sample、debounce()( www.365exe.com ).mp4

*   ├── 048.4.14-drop()、take() 系列操作符( www.365exe.com ).mp4

*   ├── 049.4.15-map() 系列操作符( www.365exe.com ).mp4

*   ├── 050.4.16-transform() 系列操作符( www.365exe.com ).mp4

*   ├── 051.4.17-withIndex() 操作符( www.365exe.com ).mp4

*   ├── 052.4.18-reduce()、fold() 系列操作符( www.365exe.com ).mp4

*   ├── 053.4.19-onEach() 操作符( www.365exe.com ).mp4

*   ├── 054.4.20-chunked() 操作符( www.365exe.com ).mp4

*   ├── 055.4.21-try_catch 和 Flow 的异常可见性( www.365exe.com ).mp4

*   ├── 056.4.22-catch() 操作符( www.365exe.com ).mp4

*   ├── 057.4.23-retry() 和 retryWhen() 操作符( www.365exe.com ).mp4

*   ├── 058.4.24-onStart() 等全流程监听系列操作符( www.365exe.com ).mp4

*   ├── 059.4.25-flowOn() 操作符( www.365exe.com ).mp4

*   ├── 060.4.26-buffer() 系列操作符( www.365exe.com ).mp4

*   ├── 061.4.27-多个 Flow 的合并( www.365exe.com ).mp4

*   ├── 062.4.29-SharedFlow 的效果和适用场景( www.365exe.com ).mp4

*   ├── 063.4.30-shareIn() 操作符( www.365exe.com ).mp4

*   ├── 064.4.31-Mutable Shared Flow( www.365exe.com ).mp4

*   ├── 065.4.32-StateFlow( www.365exe.com ).mp4

*   ├── 066.5.1-协程间的协作和等待( www.365exe.com ).mp4

*   ├── 067.5.2-select():先到先得_( www.365exe.com ).mp4

*   ├── 068.5.3-互斥锁和共享变量_( www.365exe.com ).mp4

*   ├── 069.5.4-ThreadLocal_( www.365exe.com ).mp4