关于挂起函数执行的resume是哪个Continuation的
来源:12-6 案例:仿官方框架实现 async

悠闲生活
2020-03-10
协程在生成过程中有两个Continuation,那么协程内的挂起函数获得的应该是创建的那一个,对吗?suspendCoroutine所获取的当前Continuation也是创建的那一个,对吗?
2回答
-
bennyhuo
2020-03-12
感谢同学的意见~
同学提到的“非常感谢老师的解答,我已经搞懂了。看了suspendCoroutine的源码,了解了SafeContinuation,才明白些。所以建议老师把挂起函数的它completion是谁能讲出来,相信大家理解会好一些。理解completion是谁真的很重要,理解了它对明白协程的运行轨迹很重要。下面是我在学习时总结的,自认为是对的”
协程当中总共有两个 Continuation,一个是协程自己,也就是我们创建出来的,还有一个是 completion,是我们传给协程的,这个点确实比较重要,视频里面也有重点讲哈。
我的疑问主要是在于看看是不是视频里面讲到不够清楚,我贴几个视频位置,同学有空了帮忙看下是否能够解决同学的问题,如果需要改进我后面可以补充些说明:
这页ppt讲的内容在视频的 11-5 的 12:56 左右,讲的内容其实就是在介绍这两个 Continuation 具体指的是什么。
同时对于 SafeContinuation 与上面的二者的关系,也在视频的 11-6 06:00 前后有讲解,这里也包括了对 SafeContinuation 的介绍:
后面其实还有一个更清楚的例子,就是用 Java 代码对照,在视频 11-6 06:35 前后,这个例子里面为了让大家更方便的理解,左右对照了 Java 的代码(其实就是协程本质上的实现)和 Kotlin 协程,这里也能看到 completion 以及协程本身的 Continuation 实例:
最后的这个例子由于是很早的时候我在其他课程里讲到的,因此没有在源码当中,稍后我把源码也上传一下,这样大家就可以自己运行了。
---- update ----
最后的这张ppt里的源码上传了:ContinuationImpl,同学可以试着自己运行一下~
00 -
bennyhuo
2020-03-10
没错,是这样的。ppt里面有个图,给出了suspendlambda safecontinuation 和拦截器的关系可以参考下
062020-03-12
相似问题