采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
这里先执行listen();方法,while循环不是一直在等待接受信息的么? 不应该是先执行sendBroadcast方法再执行listen方法么
恰好说到这个问题,也给你贴上后面的优化的一些疑问回答:http://coding.imooc.com/learn/questiondetail/90384.html
这里肯定是先listen然后再发送啊;你想UDP是无链接的,如果你先发送了,服务器收到了,然后立刻回送了;此时你的电脑因为CPU调度问题,恰好就延迟了那么一些然后再去listen,此时就有可能丢失掉服务器返回的信息了。
所以咱们是先listen,但是因为listen本身是异步的,是在子线程中进行的,所以在子线程中的循环读取操作并不会阻塞当前的整个进度,相当于先去挂个好看医生,然后自己做自己的事儿,当医生叫到你饿的时候就可以看病了。当然医生的例子并非恰当,这里只是说一个情况而已。
所以我们就是先监听数据返回,然后同时进行数据发送,当服务器返回数据时就会被线程的监听读取到;当然这里是有漏洞的,比如listener的线程虽然调用了start,但是并不一定就先于发送广播而启动,所以后面我们需要使用CountDown来保证Listener线程一定启动后再发送广播。
非常感谢老师的讲解!这问题想了一早上,listenner是开启的线程 无限循环也影响不到sendBroadcast方法的执行。 CountDown确保listenner在sendBroadcast之前启动好
登录后可查看更多问答,登录/注册
理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选
3.2k 1
2.2k 7
2.0k 5
2.4k 13
1.4k 13
购课补贴联系客服咨询优惠详情
慕课网APP您的移动学习伙伴
扫描二维码关注慕课网微信公众号