采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
还是不明白在广播当中的searcher的CountdownLatch的作用是干吗的,就是说如果没有这个countdownlatch程序会怎么执行,为什么说它是通知启动呢,不是已经通过start方法启动线程了吗,然后会一直while循环监听消息,直到接收任意字符结束
CountdownLatch 主要作用在于协同多个线程之间的运行;常常使用在A线程启动后需要做一些初始化操作,然后会启动B线程。请注意,B线程一定在A线程之后,但是当你之间new Thread().start() 时你并不能确保A一定先执行了,所以需要用到CountdownLatch来协同。
回到我们的课程代码:
先看这个部分,这个部分先不看传入的CountdownLatch;就单纯看当前方法中创建的CountdownLatch;它完成了一个事情,那就是启动Listener线程后当前线程等待,一直等待到Listener线程真正运行起来进入到run方法中。
然后我们再看传入进来的receiveLatch,这个实例会传递给Listener线程内部:
它的作用也很简单,就是在当前监听器收到了一个回送广播时,进行一次衰减,以便被外部等待者感知到,进入后续步骤。
那么我们回到外层的位置:
这个地方也就能够看懂了;首先我们创建一个receiveLatch的拦截实例,然后将实例传递给监听器线程,当线程收到一份广播回送数据时则进行一次衰减,以便解除当前的阻塞:
receiveLatch.await(timeout, TimeUnit.MILLISECONDS);
但是请注意,在这里我们不是直接无限死等待,而是有时间的等待,这意味着在等待时间内,没有进行衰减操作,那么我也不会继续阻塞了,我会自己触发超时往后走。而衰减操作就是有数据到达时进行,简单来说就是等待时间内没有数据到达我就不等了。若在等待时间内(10秒)第3秒就收到了回送,那么我立刻就往后走了,无需等待了。
然后回到你的疑问,如果不用CountdownLatch会怎样;假如我们全部移除掉;然后来说说一些异常情况:
1. Listener调用start后当前主线程就直接往后走了,开始去发送信息了;此时可能网络回来数据了,但是Listener还没真正运行起来也就没有进入run方法中,所以可能会丢失掉当前的回送数据;所以我们需要使用第一个startDownLatch用以确保这样的情况不会发生。
2. 假如没有receiveLatch,那么在启动Listener线程后,我们就去发送广播,然后我们就去拿数据,就返回了;此时我们的服务器极大可能并未返回数据,所以也会丢失服务器返回的数据。所以我们需要借助receiveLatch进行等待,当然不是死等待,因为有可能没有服务器给我们返回数据,所以也会有永远等不到的情况。
^_^,老师你太敬业了,谢谢这么辛苦回答这么仔细,我好好看看,你截图的代码是后来又进行优化了吗,我现在看到的视频里代码和截图有些不一样
是的哈 是最终的代码 原理差不多
这个问题你可以看一下这个:http://coding.imooc.com/learn/questiondetail/90081.html
以及这个:http://coding.imooc.com/learn/questiondetail/85104.html
后面我再补充一份文章给大家详细的说一下这个CountdownLatch的用法与作用。
嗯,怎么说呢,这样说吧,就是我觉得这个countdownlatch在这里没什么用,然后老师你按这个思路回答我,就是我知道countdownlatch是怎么用,是在这个具体的案例中不知道为什么这样用,有什么作用,如果没有这个countdownlatch会发生什么样的bug
这个上面的回答真能解决你的问题;你看外层回答哈,我详细说一下。
登录后可查看更多问答,登录/注册
理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选
2.9k 1
1.9k 7
1.7k 5
2.0k 13
1.1k 13
购课补贴联系客服咨询优惠详情
慕课网APP您的移动学习伙伴
扫描二维码关注慕课网微信公众号