线程堵塞?
来源:3-7 案例实操-局域网搜索案例-3
拾千
2018-11-28
这里先执行listen();方法,while循环不是一直在等待接受信息的么? 不应该是先执行sendBroadcast方法再执行listen方法么
写回答
1回答
-
恰好说到这个问题,也给你贴上后面的优化的一些疑问回答:http://coding.imooc.com/learn/questiondetail/90384.html
这里肯定是先listen然后再发送啊;你想UDP是无链接的,如果你先发送了,服务器收到了,然后立刻回送了;此时你的电脑因为CPU调度问题,恰好就延迟了那么一些然后再去listen,此时就有可能丢失掉服务器返回的信息了。
所以咱们是先listen,但是因为listen本身是异步的,是在子线程中进行的,所以在子线程中的循环读取操作并不会阻塞当前的整个进度,相当于先去挂个好看医生,然后自己做自己的事儿,当医生叫到你饿的时候就可以看病了。当然医生的例子并非恰当,这里只是说一个情况而已。
所以我们就是先监听数据返回,然后同时进行数据发送,当服务器返回数据时就会被线程的监听读取到;当然这里是有漏洞的,比如listener的线程虽然调用了start,但是并不一定就先于发送广播而启动,所以后面我们需要使用CountDown来保证Listener线程一定启动后再发送广播。
312018-11-28
相似问题