关于协程中线程调度的疑问

来源:7-6 协程的调度2

Da丶

2020-11-10

老师,学习到调度器这块,书里面留了一个问题,是关于协程中的线程切换的问题

情况1:

    launch {
        println("A")
        delay(2000L)
        println("B")
    }

情况2:

    launch(Dispatchers.Default) {
        println("A")
        delay(2000L)
        println("B")
    }

情况1与情况2的不同在于是否使用了调度器

书中问题:
如果设置调度器,println(“A”)和println(“B”)都处于调度器的线程下
如果不设置调度器,那么println(”A“)将运行在启动协程时所在的线程上,也就是launch调用所在的线程,而println(”B“)则运行在delay函数内部挂起1000ms后恢复执行时所在的线程。请思考一下导致这种结果的原因?

我的疑惑:
(1)针对情况2,设置了调度器,按照前面协程拦截器的介绍,我认为拦截器都可以捕捉到“协程恢复操作后到下一次挂起前”的操作,所以println(“A”)和println(“B”)这个我觉得能理解也是没问题的

(2)我的主要疑惑是不设置调度器的情况,即情况1
println(“A”)处于启动协程的线程,这一点是没问题的。
但是println(“B”)在delay恢复后的所在线程,这块有点不明白了。

我的猜想:
delay操作时,通过调用continuation.resume()方法,恢复执行,所以到下一次挂起前,所有操作都会在执行delay操作的线程中,不知道理解的对不对

写回答

2回答

bennyhuo

2020-11-11

你把resume调用当成回调函数的调用,一下就明白了。

1
1
Da丶
非常感谢!
2020-11-11
共1条回复

bennyhuo

2020-11-11

你的猜想是对的。

1
2
bennyhuo
回复
Da丶
没错,说穿了其实就很简单
2020-11-11
共2条回复

Android首选开发语言Kotlin入门与进阶

Google I/O大会钦定Android一级开发语言,现在不学,等待何时

3122 学习 · 387 问题

查看课程