关于协程中线程调度的疑问
来源: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回答
-
你把resume调用当成回调函数的调用,一下就明白了。
112020-11-11 -
bennyhuo
2020-11-11
你的猜想是对的。
122020-11-11
相似问题