Kotlin协程(2):挂起函数的原理

一 挂起函数的运行逻辑

挂起函数用状态机以挂起点将协程的运算逻辑拆分成不同的片段,每次执行协程运行不同的逻辑片段,由此可以知道协程是运行在线程中的,线程的并发处理方式也可以用在协程上。

二 常用的挂起相关函数

1.async/await
async与await成对出现,await()函数挂起当前线程,直到异步协程完成执行,使用状态机的控制逻辑来实现,并不会阻塞线程。挂起函数可以保证挂起点之后的代码一定在挂起点代码执行完成后执行,挂起函数保证顺序执行。
注意:挂起函数不一定挂起协程,如相关调用结果已经可用,库可以决定继续进行而不挂起,例如async { requestToken() }的返回值Deferred的结果已经可用时,await()挂起函数可以直接返回结果,不再挂起协程。

  1. delay(可以做延迟的挂起函数)
    delay()函数是非阻塞式的挂起函数,只会挂起当前协程,不会影响其他协程运行.

3.suspend
suspend是协程中很重要的关键字,它用来修饰函数,表示此函数是一个会挂起的函数,这个函数是非阻塞式的,它不会阻塞你当前的线程。

  1. withContext
    不会创建新的协程,指定协程上运行的代码块,这个函数可以切换到指定的协程,这个函数还可以切换到指定的线程,结束后再切换回来。

三 挂起函数不会阻塞线程

从感知上来说挂起函数是非阻塞线程的,为什么从感知上说,实际上所有的代码都是阻塞式的,只是你无法感知到阻塞,所以我们就把那些比较耗时才称为阻塞,它是怎么做到不阻塞线程的?切线程,阻塞是相对与单线程而言的,如果切了线程它自然就是非阻塞的了,到了另外一个线程了,原来的线程就可以做其它事情了。
如果协程运行在主线程可以执行请求网络的操作吗,如果在主线程切换会报错,需要切换到子线程执行。

你可能感兴趣的:(Kotlin协程(2):挂起函数的原理)