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