Continuation.resume方法执行的时序是怎样的

来源:11-9 案例:基于非对称协程 API 实现对称协程

慕UI1515986

2020-06-10

老师你好,现在看到了协程的部分,有个地方比较疑惑,就是Continuation.resume方法执行的时序

suspend fun main() {
    test1()
    //test2()
    println("after test")
}

suspend fun test1() = suspendCoroutine<Unit> {
    Thread.sleep(5000)
    it.resume(Unit)
    println("end resume test1")
}

suspend fun test2() = suspendCoroutine<Unit> {
    thread {
        Thread.sleep(5000)
        it.resume(Unit)
        println("end resume test2")
    }
}

为什么test1和test2的输出会不一样呢,debug看走test1的时候走过了resume之后会继续走println(“end resume test1”),然后才返回到main中的挂起点去执行后续的println(“after test”),但是走test2的时候却又变成了resume调用后回到挂起点去println(“after test”),然后再回到thread的代码块继续执行下面的println(“end resume test2”),这里有点不太明白,希望老师抽空解答一下

写回答

1回答

bennyhuo

2020-06-10

因为你在2里面起了新线程呀

0
7
bennyhuo
回复
慕前端9039556
resume、resumeWithException 前一个是正常的恢复,后面一个是异常的恢复,resumeWith 是二者的整合,把异常和正常的结果封装到了它的参数 Result 当中。
2020-08-13
共7条回复

学会Kotlin 突破开发语言瓶颈

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

1760 学习 · 481 问题

查看课程