请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于协程和线程的一些问题

老师,在看扔无线大佬视频的时候,他解释协程就是在切换线程。有一些地方不明白:

  1. 线程中可以包含多个协程,而协程使用调度器切换,那不就是切换线程吗?
  2. 网络请求中,挂起也是切线程吗?

正在回答 回答被采纳积分+3

2回答

bennyhuo 2020-01-10 18:36:07

晚点儿再回复你的两个具体问题

0 回复 有任何疑惑可以回复我~
bennyhuo 2020-01-10 18:21:24

你把他的视频忘了再来看吧,他的视频篇幅太少决定了他只能讲的太浅,这也是没办法的事儿。

不要纠结切不切线程的问题,先把协程的本质搞懂,剩下的就都通了。协程的本质就是开发者可以控制挂起和恢复,没有别的了,抓住这个概念再去琢磨我们可以利用协程干什么,最常见的就是把异步逻辑同步化。你看,这个过程跟线程的关系在哪儿呢?没有直接的关系。

0 回复 有任何疑惑可以回复我~
  • 提问者 Petterp #1
    是没有直接关系,的确,协程框架用起来是非常简单易用。内部的实现其实还是切换了线程,但并不是因此说它是就是一个线程框架。协程的目的是让开发者用同步方式写出异步的代码,也就如同kotlin的编码规范一样,在java中,我们无需关注null,泛型类型等问题,而在kt中,我们需要改变编码习惯,避免null指针等问题,回到协程上,协程的挂起与恢复交给了我们开发者去自由操作,也就是最前面说的同步代码,异步操作,从而可以避免回调地狱等问题,在这点上,它和线程没有什么关系,因为我们直接关注的是它的语法方面。我是这样理解的,不知道对不对
    回复 有任何疑惑可以回复我~ 2020-01-10 18:37:35
  • bennyhuo 回复 提问者 Petterp #2
    说的挺好的
    回复 有任何疑惑可以回复我~ 2020-01-10 18:56:52
  • compya 回复 提问者 Petterp #3
    我的理解是Coroutine把線程切換這一塊抽象了,本質上把各代碼塊用Suspend/Resume分段,內部實現用狀態機來處理。而分段的代碼再用Dispatcher去決定運行在哪個線程上,如果都設定在Main thread的話,就算有協程但沒有切換線程。
    
    理解不知道對不,有錯請多指教
    回复 有任何疑惑可以回复我~ 2020-01-28 23:25:43
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信