协程1-suspend关键字
2020-08-24 本文已影响0人
Xigong
suspend 有两个:
-
suspend 关键字,用来修饰函数定义
image.png
-
suspend 函数,用来把一个函数转化为suspend挂起函数
image.png
suspend 函数的执行原理:
- suspend 函数会编译成普通的函数,在函数最后增加一个Continuation 的形参。
例如:

编译后生成了:

-
在这里调用一个挂起函数会怎么执行呢?
image.png
编译生成了:

翻译成伪代码帮助理解(忽略一些无关因素):

总结,调用挂起函数的地方,编译器添加了判断条件,进行返回,然后再恢复时,重新调用该方法,又回到了上次函数返回的地方。
再总结一遍,挂起函数,编辑器在内部生成了一个Continuation,然后执行到挂起点,return。接着协程恢复时,通过上一次记录的位置,又调用这个函数,跳转到上一次的结束位置,继续执行,往复循环,直到函数执行结束且没有再继续执行Continuation
QA:
-
再次调用这个函数又能回到上次执行完的地方是怎么实现的呢?
举一个复杂的例子
image.png
是通过switch和label,实现的,Continuaion 会记录上一次离开函数的位置

下一执行的时候,会判断label这个值

break ,然后会走到这里:

延迟5秒后,继续执行contrinuation,又会执行test1函数,直到全部执行完毕。