內(nèi)容簡介
這是一部從工作機制、實現(xiàn)原理、應用場景、使用方法、實踐技巧、標準庫、框架、應用案例等多個維度全面講解Kotlin協(xié)程的專著,它同時提供了多語言視角,亦可通過本書了解其他語言的協(xié)程。
本書作者是騰訊的的高級工程師,是國內(nèi)Kotlin領域的先驅(qū)者和布道者,不僅在工程實踐領域積累了豐富的經(jīng)驗,而且在Kotlin開發(fā)者社群里有廣泛的影響力和號召力。
全書共9章:
第1章從協(xié)程的核心應用場景——異步程序設計的思路和關鍵問題切入,引出Kotlin協(xié)程的概念;
第2章首先介紹了協(xié)程的概念、分類,然后講解了Python、Lua、Go等不同語言的協(xié)程實現(xiàn)和對比;
第3~4章以 Kotlin 標準庫的協(xié)程 API 為核心,講解了簡單協(xié)程的使用方法和運行機制,以及通過簡單協(xié)程設計和實現(xiàn)復合協(xié)程的思路和方法;
第5~6章以Kotlin的官方協(xié)程框架為模板,通過逐步實現(xiàn)其中的核心功能,分析了其中的實現(xiàn)細節(jié)和復合協(xié)程的運行機制,并對框架的使用做了深入探討;
第7~8章講解了協(xié)程在Android應用開發(fā)和Web服務開發(fā)中的應用場景、面臨的挑戰(zhàn),以及解決各種常見問題的方法和思路;
第9章探討了JavaScript 和 Native等非JVM平臺對協(xié)程的支持情況,以及協(xié)程在這些平臺上的應用。
前言
第1章 異步程序設計介紹1
1.1 異步的概念1
1.1.1 程序的執(zhí)行1
1.1.2 異步與回調(diào)2
1.1.3 回調(diào)地獄3
1.2 異步程序設計的關鍵問題4
1.2.1 結果傳遞4
1.2.2 異常處理6
1.2.3 取消響應8
1.2.4 復雜分支9
1.3 常見異步程序設計思路10
1.3.1 Future11
1.3.2 CompletableFuture11
1.3.3 Promise與async/await13
1.3.4 響應式編程15
1.3.5 Kotlin協(xié)程15
1.4 本章小結17
第2章 協(xié)程的基本概念18
2.1 協(xié)程究竟是什么18
2.2 協(xié)程的分類20
2.2.1 按調(diào)用棧分類20
2.2.2 按調(diào)度方式分類22
2.3 協(xié)程的實現(xiàn)舉例22
2.3.1 Python的Generator23
2.3.2 Lua標準庫的協(xié)程實現(xiàn)24
2.3.3 Go的go routine27
2.4 本章小結30
第3章 Kotlin協(xié)程的基礎設施31
3.1 協(xié)程的構造31
3.1.1 協(xié)程的創(chuàng)建32
3.1.2 協(xié)程的啟動32
3.1.3 協(xié)程體的Receiver34
3.1.4 可掛起的main函數(shù)36
3.2 函數(shù)的掛起37
3.2.1 掛起函數(shù)37
3.2.2 掛起點38
3.2.3 CPS變換39
3.3 協(xié)程的上下文41
3.3.1 協(xié)程上下文的集合特征41
3.3.2 協(xié)程上下文元素的實現(xiàn)42
3.3.3 協(xié)程上下文的使用43
3.4 協(xié)程的攔截器45
3.4.1 攔截的位置45
3.4.2 攔截器的使用46
3.4.3 攔截器的執(zhí)行細節(jié)47
3.5 Kotlin協(xié)程所屬的類別48
3.5.1 調(diào)用棧的廣義和狹義48
3.5.2 調(diào)度關系的對立與統(tǒng)一49
3.6 本章小結50
第4章 Kotlin協(xié)程的拓展實踐51
4.1 序列生成器51
4.1.1 仿Python的Generator實現(xiàn)52
4.1.2 標準庫的序列生成器介紹56
4.2 Promise模型57
4.2.1 async/await與suspend的設計對比58
4.2.2 仿JavaScript的async/await實現(xiàn)59
4.3 Lua風格的協(xié)程API61
4.3.1 非對稱API實現(xiàn)61
4.3.2 對稱API實現(xiàn)67
4.4 再談協(xié)程的概念72
4.4.1 簡單協(xié)程與復合協(xié)程73
4.4.2 復合協(xié)程的實現(xiàn)模式73
4.5 本章小結74
第5章 Kotlin協(xié)程框架開發(fā)初探75
5.1 開胃菜:實現(xiàn)一個delay函數(shù)75
5.2 協(xié)程的描述77
5.2.1 協(xié)程的描述類78
5.2.2 協(xié)程的狀態(tài)79
5.2.3 支持回調(diào)的狀態(tài)80
5.2.4 協(xié)程的初步實現(xiàn)83
5.3 協(xié)程的創(chuàng)建84
5.3.1 無返回值的launch84
5.3.2 實現(xiàn)invokeOnCompletion85
5.3.3 實現(xiàn)join89
5.3.4 有返回值的async90
5.4 協(xié)程的調(diào)度92
5.4.1 協(xié)程的執(zhí)行調(diào)度92
5.4.2 協(xié)程的調(diào)度位置93
5.4.3 協(xié)程的調(diào)度器設計93
5.4.4 基于線程池的調(diào)度器94
5.4.5 基于UI事件循環(huán)的調(diào)度器96
5.4.6 為協(xié)程添加默認調(diào)度器97
5.5 協(xié)程的取消98
5.5.1 完善協(xié)程的取消邏輯98
5.5.2 支持取消的掛起函數(shù)100
5.5.3 CancellableContinuation的實現(xiàn)103
5.5.4 改造掛起函數(shù)106
5.6 協(xié)程的異常處理109
5.6.1 定義異常處理器110
5.6.2 處理協(xié)程的未捕獲異常111
5.6.3 區(qū)別對待取消異常111
5.6.4 異常處理器的運用113
5.7 協(xié)程的作用域113
5.7.1 作用域的概念113
5.7.2 作用域的聲明114
5.7.3 建立父子關系116
5.7.4 頂級作用域116
5.7.5 協(xié)同作用域117
5.7.6 suspend fun main的作用域119
5.7.7 實現(xiàn)異常的傳播120
5.7.8 主從作用域121
5.7.9 完整的異常處理流程122
5.7.10 父協(xié)程等待子協(xié)程完成122
5.8 本章小結123
第6章 Kotlin協(xié)程的官方框架124
6.1 協(xié)程框架概述124
6.1.1 框架的構成124
6.1.2 協(xié)程的啟動模式126
6.1.3 協(xié)程的調(diào)度器127
6.1.4 協(xié)程的全局異常處理器129
6.1.5 協(xié)程的取消檢查130
6.1.6 協(xié)程的超時取消132
6.1.7 禁止取消133
6.2 熱數(shù)據(jù)通道Channel134
6.2.1 認識Channel134
6.2.2 Channel的容量136
6.2.3 迭代Channel138
6.2.4 produce和actor138
6.2.5 Channel的關閉140
6.2.6 BroadcastChannel142
6.2.7 Channel版本的序列生成器144
6.2.8 Channel的內(nèi)部結構146
6.3 冷數(shù)據(jù)流Flow148
6.3.1 認識Flow149
6.3.2 對比RxJava的線程切換150
6.3.3 冷數(shù)據(jù)流151
6.3.4 異常處理151
6.3.5 末端操作符153
6.3.6 分離Flow的消費和觸發(fā)153
6.3.7 Flow的取消154
6.3.8 其他Flow的創(chuàng)建方式155
6.3.9 Flow的背壓155
6.3.10 Flow的變換157
6.4 多路復用select158
6.4.1 復用多個await158
6.4.2 復用多個Channel160
6.4.3 SelectClause161
6.4.4 使用Flow實現(xiàn)多路復用161
6.5 并發(fā)安全163
6.5.1 不安全的并發(fā)訪問163
6.5.2 協(xié)程的并發(fā)工具164
6.5.3 避免訪問外部可變狀態(tài)165
6.6 本章小結166
第7章 Kotlin協(xié)程在Android上的應用167
7.1 Android上的異步問題167
7.1.1 基于UI的異步問題分析167
7.1.2 “雞肋”的AsyncTask169
7.1.3 “燙手”的回調(diào)169
7.1.4 “救世”的RxJava170
7.2 協(xié)程對UI的支持173
7.2.1 UI調(diào)度器173
7.2.2 協(xié)程版AutoDispose174
7.2.3 Lifecycle的協(xié)程支持176
7.3 常見框架的協(xié)程擴展177
7.3.1 RxJava的擴展177
7.3.2 異步組件ListenableFuture179
7.3.3 ORM框架Room180
7.3.4 圖片加載框架coil181
7.3.5 網(wǎng)絡框架Retrofit182
7.3.6 協(xié)程風格的對話框183
7.4 本章小結184
第8章 Kotlin協(xié)程在Web服務中的應用185
8.1 多任務并發(fā)模型185
8.1.1 多進程的服務模型185
8.1.2 多線程的服務模型186
8.1.3 事件驅(qū)動與異步I/O186
8.2 協(xié)程在多任務模型中的運用190
8.2.1 協(xié)程與異步I/O191
8.2.2 協(xié)程與“輕量級線程”192
8.3 常見Web應用框架的協(xié)程擴展193
8.3.1 Spring的響應式支持193
8.3.2 Vert.x196
8.3.3 Ktor199
8.4 本章小結203
第9章 Kotlin協(xié)程在其他平臺上的應用204
9.1 Kotlin-Js204
9.1.1 Kotlin-Js概述205
9.1.2 Kotlin-Js上的協(xié)程209
9.2 Kotlin-Native212
9.2.1 Kotlin-Native概述212
9.2.2 Kotlin-Native的協(xié)程支持218
9.3 本章小結221