线程堵塞?

来源:3-7 案例实操-局域网搜索案例-3

拾千

2018-11-28

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

写回答

1回答

Qiujuer

2018-11-28

恰好说到这个问题,也给你贴上后面的优化的一些疑问回答: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
共1条回复

Socket网络编程进阶与实战 系统掌握Socket核心技术

理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选

2314 学习 · 476 问题

查看课程