请稍等 ...
×

采纳答案成功!

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

countdownLatch的作用

还是不明白在广播当中的searcher的CountdownLatch的作用是干吗的,就是说如果没有这个countdownlatch程序会怎么执行,为什么说它是通知启动呢,不是已经通过start方法启动线程了吗,然后会一直while循环监听消息,直到接收任意字符结束

正在回答

2回答

CountdownLatch 主要作用在于协同多个线程之间的运行;常常使用在A线程启动后需要做一些初始化操作,然后会启动B线程。
请注意,B线程一定在A线程之后,但是当你之间new Thread().start() 时你并不能确保A一定先执行了,所以需要用到CountdownLatch来协同。



回到我们的课程代码:

https://img1.sycdn.imooc.com//szimg/5bfd67930001eba513520254.jpg

先看这个部分,这个部分先不看传入的CountdownLatch;就单纯看当前方法中创建的CountdownLatch;它完成了一个事情,那就是启动Listener线程后当前线程等待,一直等待到Listener线程真正运行起来进入到run方法中。


然后我们再看传入进来的receiveLatch,这个实例会传递给Listener线程内部:

https://img1.sycdn.imooc.com//szimg/5bfd683d0001cc5115520532.jpg

它的作用也很简单,就是在当前监听器收到了一个回送广播时,进行一次衰减,以便被外部等待者感知到,进入后续步骤。

https://img1.sycdn.imooc.com//szimg/5bfd68880001728315441614.jpg

那么我们回到外层的位置:

https://img1.sycdn.imooc.com//szimg/5bfd68b00001a6b008940330.jpg

这个地方也就能够看懂了;首先我们创建一个receiveLatch的拦截实例,然后将实例传递给监听器线程,当线程收到一份广播回送数据时则进行一次衰减,以便解除当前的阻塞:

receiveLatch.await(timeout, TimeUnit.MILLISECONDS);

但是请注意,在这里我们不是直接无限死等待,而是有时间的等待,这意味着在等待时间内,没有进行衰减操作,那么我也不会继续阻塞了,我会自己触发超时往后走。而衰减操作就是有数据到达时进行,简单来说就是等待时间内没有数据到达我就不等了。若在等待时间内(10秒)第3秒就收到了回送,那么我立刻就往后走了,无需等待了。


然后回到你的疑问,如果不用CountdownLatch会怎样;假如我们全部移除掉;然后来说说一些异常情况:

1. Listener调用start后当前主线程就直接往后走了,开始去发送信息了;此时可能网络回来数据了,但是Listener还没真正运行起来也就没有进入run方法中,所以可能会丢失掉当前的回送数据;所以我们需要使用第一个startDownLatch用以确保这样的情况不会发生。


2. 假如没有receiveLatch,那么在启动Listener线程后,我们就去发送广播,然后我们就去拿数据,就返回了;此时我们的服务器极大可能并未返回数据,所以也会丢失服务器返回的数据。所以我们需要借助receiveLatch进行等待,当然不是死等待,因为有可能没有服务器给我们返回数据,所以也会有永远等不到的情况。

4 回复 有任何疑惑可以回复我~
  • 提问者 等待灬 #1
    ^_^,老师你太敬业了,谢谢这么辛苦回答这么仔细,我好好看看,你截图的代码是后来又进行优化了吗,我现在看到的视频里代码和截图有些不一样
    回复 有任何疑惑可以回复我~ 2018-11-28 09:32:59
  • Qiujuer 回复 提问者 等待灬 #2
    是的哈 是最终的代码 原理差不多
    回复 有任何疑惑可以回复我~ 2018-11-28 09:42:07
Qiujuer 2018-11-27 22:00:31

这个问题你可以看一下这个:http://coding.imooc.com/learn/questiondetail/90081.html

以及这个:http://coding.imooc.com/learn/questiondetail/85104.html

后面我再补充一份文章给大家详细的说一下这个CountdownLatch的用法与作用。

0 回复 有任何疑惑可以回复我~
  • 提问者 等待灬 #1
    嗯,怎么说呢,这样说吧,就是我觉得这个countdownlatch在这里没什么用,然后老师你按这个思路回答我,就是我知道countdownlatch是怎么用,是在这个具体的案例中不知道为什么这样用,有什么作用,如果没有这个countdownlatch会发生什么样的bug
    回复 有任何疑惑可以回复我~ 2018-11-27 23:17:11
  • Qiujuer 回复 提问者 等待灬 #2
    这个上面的回答真能解决你的问题;你看外层回答哈,我详细说一下。
    回复 有任何疑惑可以回复我~ 2018-11-27 23:47:08
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信