有个地方不理解

来源:12-2 案例:仿官方框架实现 launch 2

慕雪4289266

2020-09-30

private suspend fun joinSuspend() = suspendCoroutine<Unit> { continuation ->
    doOnCompleted {
        continuation.resume(Unit)
    }
}

上面这个join的实现,用到了suspendCoroutine,我记得前几节课里,老师你说过,suspendCoroutine中必须要执行线程切换,这个suspend函数才会被真正的挂起,挂起后会返回一个特殊的标记对象。但是这里doOnCompleted中我看了下只是用来创建和保存Disposable,并没有执行线程切换呀?它是如何被挂起的呢?

写回答

1回答

bennyhuo

2020-09-30

切换调用栈不一定切换线程。我肯定不会说一定要切线程的。

切换线程是切换调用栈的充分不必要条件。其实只要保存回调,在其他时候同一个线程调用,一样不是异步的。

0
4
bennyhuo
这里说的挂起不一定需要切换线程,你可以去看看generator那一节,保存continuation,在后续其他时候调用(而不是在当前函数当中调用),一样会挂起。此外,类似于android当中的handler.post,如果在主线程直接调用,也可以在主线程上完成异步,而不需要切换线程。
2020-10-08
共4条回复

学会Kotlin 突破开发语言瓶颈

如果有一门语言可以取代Java,那么它一定是Kotlin。

1760 学习 · 481 问题

查看课程