请稍等 ...
×

采纳答案成功!

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

线程堵塞?

图片描述
这里先执行listen();方法,while循环不是一直在等待接受信息的么? 不应该是先执行sendBroadcast方法再执行listen方法么

正在回答

1回答

恰好说到这个问题,也给你贴上后面的优化的一些疑问回答:http://coding.imooc.com/learn/questiondetail/90384.html


这里肯定是先listen然后再发送啊;你想UDP是无链接的,如果你先发送了,服务器收到了,然后立刻回送了;此时你的电脑因为CPU调度问题,恰好就延迟了那么一些然后再去listen,此时就有可能丢失掉服务器返回的信息了。


所以咱们是先listen,但是因为listen本身是异步的,是在子线程中进行的,所以在子线程中的循环读取操作并不会阻塞当前的整个进度,相当于先去挂个好看医生,然后自己做自己的事儿,当医生叫到你饿的时候就可以看病了。当然医生的例子并非恰当,这里只是说一个情况而已。


所以我们就是先监听数据返回,然后同时进行数据发送,当服务器返回数据时就会被线程的监听读取到;当然这里是有漏洞的,比如listener的线程虽然调用了start,但是并不一定就先于发送广播而启动,所以后面我们需要使用CountDown来保证Listener线程一定启动后再发送广播。

3 回复 有任何疑惑可以回复我~
  • 提问者 拾千 #1
    非常感谢老师的讲解!这问题想了一早上,listenner是开启的线程 无限循环也影响不到sendBroadcast方法的执行。 CountDown确保listenner在sendBroadcast之前启动好
    回复 有任何疑惑可以回复我~ 2018-11-28 10:36:26
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号