请稍等 ...
×

采纳答案成功!

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

今天上了runBlocking课,有几个问题想跟老师同学们讨论一下

question1:老师说第三次打印joinBlocking说的太快,没听清,不过我认为是delay函数完成调用的resume,不知道是不是这样。
图片描述

question2:我在此处打印了 runBlocking,我不明白为啥这个东西能最先打印?BlockingQueueDispatcher里面也没有切换线程,都在主线程里。按理说block函数体应该先执行。才能走到后面的log(“runBlocking”)

图片描述

打印顺序如下:图片描述

question3: 另外还有一个小问题 不知道我为啥 打印线程名字的时候是[main null] 代码是我下载的,我看视频里也不是main null。。。

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

3回答

bennyhuo 2020-10-21 05:42:15

2. dispatch的时候只是放到队列里,因此没有执行。执行要等到joinBlocking。

1 回复 有任何疑惑可以回复我~
  • 提问者 慕前端9039556 #1
    追问一下哈,我又遇到一块不理解的地方。如果我把runBlocking代码块里面的 job.join()注掉。那么lunch有些内容就不打印了,这个情况怎么解释。。
    回复 有任何疑惑可以回复我~ 2020-10-21 07:11:36
  • 提问者 慕前端9039556 #2
    补充一下 不是完全不打印了,而是runblocking 执行完了,如果 lunch里面还有delay没执行完,那么delay后面的都不打印了。
    我得想法是,runblocking 内部调用lunch 会创建一个全新的协程,新协程得completion是自己内部创建的,也就等于说lunch创建的协程体跟外层runBlocking创建的协程之间没有什么依赖关系。它是一个单独得状态机。runBlocking执行完了不应该影响lunch里面得回调逻辑。。。
    回复 有任何疑惑可以回复我~ 2020-10-21 17:47:54
  • bennyhuo 回复 提问者 慕前端9039556 #3
    本来就是啊,launch就是启动了一个新的协程。
    回复 有任何疑惑可以回复我~ 2020-10-21 18:02:37
bennyhuo 2020-10-21 05:44:29

3 那个 main是线程名,null是协程名, runBlocking 里面有名字,但外面是 suspend main,所以是null

0 回复 有任何疑惑可以回复我~
  • 提问者 慕前端9039556 #1
    “但外面是 suspend main”这句没听懂。 我看你视频里 打印joinBlocking 有协程名。咱俩代码都是一样的呀
    回复 有任何疑惑可以回复我~ 2020-10-21 06:56:43
  • bennyhuo 回复 提问者 慕前端9039556 #2
    我看错了,外面不是 suspend main,外面根本不是协程,所以没有协程名也很正常。
    
    视频里面可能是放到另外的协程启动的吧,这个不是特别重要,不用太纠结。
    回复 有任何疑惑可以回复我~ 2020-10-21 18:01:33
bennyhuo 2020-10-21 05:41:05

1. 是的

0 回复 有任何疑惑可以回复我~
  • 是不是用来替代。suspend main()  “runSuspend”那个用来阻塞主线程,用来保证内部的launch开启的协程先执行完
    回复 有任何疑惑可以回复我~ 2020-11-13 15:53:44
  • 其实suspend main函数出来之前,都是用eunBlocking做例子的。
    回复 有任何疑惑可以回复我~ 2020-11-13 16:13:14
  • runBlocking
    回复 有任何疑惑可以回复我~ 2020-11-13 16:13:25
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信