协程的启动与取消
2021-09-02 本文已影响0人
因为我的心
1、协程构建器
- launch与async构建器都用来启动新协程
- launch,返回一个Job并且不附带任何结果值;
- async,返回一个Deferred,Deferred也是一个Job,可以使用.await()在一个延期的值上得到它的最终结果;
- 等待一个作业
- join与await
- 组合并发
2、协程的启动模式
- DEFAULT:协程创建后,立即开始调度,在调度前如果协程取消,其将直接进入取消响应的状态;
- ATOMIC:协程创建后,立即开始调度,协程执行到第一个挂起点之前不响应取消;
- LAZY:只有协程被需要时,包括主动调用协程的start、join或者await等函数时才会开始调度,如果调度前就被取消,那么该协程直接进入异常结束状态;
- UNDISPATCHED:协程创建后立即在当前函数调用栈中执行,直到遇到第一个真正挂起的点;
3、协程的作用域构建器
coroutineScope与runBlocking区别:
- runBlocking是常规函数,而coroutineScope是挂起函数。
- 它们都会等待其协程体以及所有子协程结束,主要区别在于runBlocking方法会阻塞当前线程来等待,而coroutineScope只是挂起,会释放底层线程用于其它用途。
4、coroutineScope与supervisorScope区别:
- coroutineScope:一个协程失败了,所有其他兄弟协程也会被取消。
- supervisorScope:一个协程失败了,不会影响其他兄弟协程。
5、Job对象
![](https://img.haomeiwen.com/i11268516/bdf9ed693301e346.png)
6、Job的生命周期
![](https://img.haomeiwen.com/i11268516/a77fecff63a626ab.png)
7、协程的取消
![](https://img.haomeiwen.com/i11268516/930aa535d6d43b30.png)
8、CUP密集型任务取消
![](https://img.haomeiwen.com/i11268516/1858c6f034e4a40c.png)
9、协程取消的副作用
![](https://img.haomeiwen.com/i11268516/9e2849cc545c1036.png)
10、不能取消的任务
![](https://img.haomeiwen.com/i11268516/6b286bb94a511a91.png)
11、超时任务
![](https://img.haomeiwen.com/i11268516/9e700ca066a0102a.png)