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






