@@ -6,6 +6,8 @@ Kotlin Coroutine
6
6
7
7
1 . 启动协程的三种方式
8
8
2 . 挂起函数
9
+ 2 . 协程的生命周期
10
+ 2 .
9
11
10
12
#### 启动协程
11
13
@@ -27,4 +29,20 @@ async,则是很多编程语言当中普遍存在的协程模式。它像是结
27
29
28
30
挂起函数,只能在协程当中被调用,或者是被其他挂起函数调用。但协程中的 block,本质上仍然是挂起函数。
29
31
30
- 所以我们可以认为,挂起和恢复是协程的一种底层能力;而挂起函数则是一种上层的表现形式。
32
+ 所以我们可以认为,挂起和恢复是协程的一种底层能力;而挂起函数则是一种上层的表现形式。
33
+
34
+ #### 协程的生命周期
35
+
36
+ Job 是 launch 的返回值,Deferred 是 async 的返回值,而 Deferred 也是实现了 Job 的接口。
37
+
38
+ 协程是有生命周期的,同时协程是结构化的。具体来说有以下几点:
39
+
40
+ 1 . Job,相当于协程的句柄,Job 与协程的关系,有点像 "遥控器与空调的关系"。
41
+ 2 . Job 在它的内部,维护了一系列的生命周期状态,它也对应着协程的生命周期状态。
42
+ 3 . 通过 Job,我们可以监测协程的状态,比如 isActive、isCancelled、isCompleted;另外,我们也可以一定程度的操控协程的状态,比如 start()、cancel()。
43
+ 4 . 除此之外,我们还可以通过 Job.invokeOnCompletion{ } 来监听协程执行完毕的事件;通过 Job.join() 这个挂起函数,我们可以挂起当前协程的执行流程,等到协程执行完毕以后,再恢复执行后面的代码。
44
+ 5 . 而对于 Deferred.await(),它的行为模式和 Job.join() 类似,只是它还会返回协程的执行结果。
45
+ 6 . 另外,协程是结构化的并发,这是它的第二大优势。通过分析 Job 的源码,我们发现,一个 Job 可以拥有多个 ChildJob;对应的,协程也可以拥有多个 "子协程"。
46
+ 7 . 结构化并发的最大优势在于,我们可以实现只控制 "父协程",从而达到控制一堆子协程的目的。parentJob.join() 不仅仅只会等待它自身执行完毕,还会等待它内部的 job1、job2、job3 执行完毕,parentJon.cancel() 同理。
47
+
48
+ ####
0 commit comments