前言
第1章 異步程序設計介紹 1
1.1 異步的概念 1
1.1.1 程序的執行 1
1.1.2 異步與迴調 2
1.1.3 迴調地獄 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 Future 11
1.3.2 CompletableFuture 11
1.3.3 Promise與async/await 13
1.3.4 響應式編程 15
1.3.5 Kotlin協程 15
1.4 本章小結 17
第2章 協程的基本概念 18
2.1 協程究竟是什麼 18
2.2 協程的分類 20
2.2.1 按調用棧分類 20
2.2.2 按調度方式分類 22
2.3 協程的實現舉例 22
2.3.1 Python的Generator 23
2.3.2 Lua標準庫的協程實現 24
2.3.3 Go的go routine 27
2.4 本章小結 30
第3章 Kotlin協程的基礎設施 31
3.1 協程的構造 31
3.1.1 協程的創建 32
3.1.2 協程的啓動 32
3.1.3 協程體的Receiver 34
3.1.4 可掛起的main函數 36
3.2 函數的掛起 37
3.2.1 掛起函數 37
3.2.2 掛起點 38
3.2.3 CPS變換 39
3.3 協程的上下文 41
3.3.1 協程上下文的集閤特徵 41
3.3.2 協程上下文元素的實現 42
3.3.3 協程上下文的使用 43
3.4 協程的攔截器 45
3.4.1 攔截的位置 45
3.4.2 攔截器的使用 46
3.4.3 攔截器的執行細節 47
3.5 Kotlin協程所屬的類彆 48
3.5.1 調用棧的廣義和狹義 48
3.5.2 調度關係的對立與統一 49
3.6 本章小結 50
第4章 Kotlin協程的拓展實踐 51
4.1 序列生成器 51
4.1.1 仿Python的Generator實現 52
4.1.2 標準庫的序列生成器介紹 56
4.2 Promise模型 57
4.2.1 async/await與suspend的設計對比 58
4.2.2 仿JavaScript的async/await實現 59
4.3 Lua風格的協程API 61
4.3.1 非對稱API實現 61
4.3.2 對稱API實現 67
4.4 再談協程的概念 72
4.4.1 簡單協程與復閤協程 73
4.4.2 復閤協程的實現模式 73
4.5 本章小結 74
第5章 Kotlin協程框架開發初探 75
5.1 開胃菜:實現一個delay函數 75
5.2 協程的描述 77
5.2.1 協程的描述類 78
5.2.2 協程的狀態 79
5.2.3 支持迴調的狀態 80
5.2.4 協程的初步實現 83
5.3 協程的創建 84
5.3.1 無返迴值的launch 84
5.3.2 實現invokeOnCompletion 85
5.3.3 實現join 89
5.3.4 有返迴值的async 90
5.4 協程的調度 92
5.4.1 協程的執行調度 92
5.4.2 協程的調度位置 93
5.4.3 協程的調度器設計 93
5.4.4 基於綫程池的調度器 94
5.4.5 基於UI事件循環的調度器 96
5.4.6 為協程添加默認調度器 97
5.5 協程的取消 98
5.5.1 完善協程的取消邏輯 98
5.5.2 支持取消的掛起函數 100
5.5.3 CancellableContinuation的實現 103
5.5.4 改造掛起函數 106
5.6 協程的異常處理 109
5.6.1 定義異常處理器 110
5.6.2 處理協程的未捕獲異常 111
5.6.3 區彆對待取消異常 111
5.6.4 異常處理器的運用 113
5.7 協程的作用域 113
5.7.1 作用域的概念 113
5.7.2 作用域的聲明 114
5.7.3 建立父子關係 116
5.7.4 頂級作用域 116
5.7.5 協同作用域 117
5.7.6 suspend fun main的作用域 119
5.7.7 實現異常的傳播 120
5.7.8 主從作用域 121
5.7.9 完整的異常處理流程 122
5.7.10 父協程等待子協程完成 122
5.8 本章小結 123
第6章 Kotlin協程的官方框架 124
6.1 協程框架概述 124
6.1.1 框架的構成 124
6.1.2 協程的啓動模式 126
6.1.3 協程的調度器 127
6.1.4 協程的全局異常處理器 129
6.1.5 協程的取消檢查 130
6.1.6 協程的超時取消 132
6.1.7 禁止取消 133
6.2 熱數據通道Channel 134
6.2.1 認識Channel 134
6.2.2 Channel的容量 136
6.2.3 迭代Channel 138
6.2.4 produce和actor 138
6.2.5 Channel的關閉 140
6.2.6 BroadcastChannel 142
6.2.7 Channel版本的序列生成器 144
6.2.8 Channel的內部結構 146
6.3 冷數據流Flow 148
6.3.1 認識Flow 149
6.3.2 對比RxJava的綫程切換 150
6.3.3 冷數據流 151
6.3.4 異常處理 151
6.3.5 末端操作符 153
6.3.6 分離Flow的消費和觸發 153
6.3.7 Flow的取消 154
6.3.8 其他Flow的創建方式 155
6.3.9 Flow的背壓 155
6.3.10 Flow的變換 157
6.4 多路復用select 158
6.4.1 復用多個await 158
6.4.2 復用多個Channel 160
6.4.3 SelectClause 161
6.4.4 使用Flow實現多路復用 161
6.5 並發安全 163
6.5.1 不安全的並發訪問 163
6.5.2 協程的並發工具 164
6.5.3 避免訪問外部可變狀態 165
6.6 本章小結 166
第7章 Kotlin協程在Android上的應用 167
7.1 Android上的異步問題 167
7.1.1 基於UI的異步問題分析 167
7.1.2 “雞肋”的AsyncTask 169
7.1.3 “燙手”的迴調 169
7.1.4 “救世”的RxJava 170
7.2 協程對UI的支持 173
7.2.1 UI調度器 173
7.2.2 協程版AutoDispose 174
7.2.3 Lifecycle的協程支持 176
7.3 常見框架的協程擴展 177
7.3.1 RxJava的擴展 177
7.3.2 異步組件ListenableFuture 179
7.3.3 ORM框架Room 180
7.3.4 圖片加載框架coil 181
7.3.5 網絡框架Retrofit 182
7.3.6 協程風格的對話框 183
7.4 本章小結 184
第8章 Kotlin協程在Web服務中的應用 185
8.1 多任務並發模型 185
8.1.1 多進程的服務模型 185
8.1.2 多綫程的服務模型 186
8.1.3 事件驅動與異步I/O 186
8.2 協程在多任務模型中的運用 190
8.2.1 協程與異步I/O 191
8.2.2 協程與“輕量級綫程” 192
8.3 常見Web應用框架的協程擴展 193
8.3.1 Spring的響應式支持 193
8.3.2 Vert.x 196
8.3.3 Ktor 199
8.4 本章小結 203
第9章 Kotlin協程在其他平颱上的應用 204
9.1 Kotlin-Js 204
9.1.1 Kotlin-Js概述 205
9.1.2 Kotlin-Js上的協程 209
9.2 Kotlin-Native 212
9.2.1 Kotlin-Native概述 212
9.2.2 Kotlin-Native的協程支持 218
9.3 本章小結 221
· · · · · · (
收起)