不明白countDownLatch.countDown()为什么是放在监听回送端口前而不是后

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

alexnest3882392

2019-03-27

CountDownLatch对象设置一个初始的数字作为计数值,任何调用这个对象上的await()方法都会阻塞,直到这个计数器的计数值被其他的线程减为0为止。
如果这样理解的话,countDownLatch.countDown()放在ds = new DatagramSocket(listenPort)之前,那不是意味着还没监听端口就已经清0了,就执行发送广播了吗,摆在ds = new DatagramSocket(listenPort)之后才算是已经执行完监听动作再发送广播?老师,我对CountDownLatch在哪里产生了误解?

写回答

1回答

Qiujuer

2019-03-27

//img.mukewang.com/szimg/5c9b98440001fe5f16381312.jpg

你是说的这里吧?

在这里的确可以如你所说放到:

ds = new DatagramSocket(listenPort)

之后进行,这里没有这么做,其实最初考虑的时候并非是一定考虑进入到端口监听时,而是考虑的线程同步,至少满足线程已启动后主线程才继续往下走的目的。

其实就算我们调用了.countDown();也并不会导致主线程立即唤醒,这还需要等待CPU的调度以及状态的恢复才行。

当然还包括了我们需要发送广播,再通过网卡发送的过程,这个时间基本上CPU只要没毛病几乎都会进入到监听阶段。

当然这里并不保证一定会优先进入到监听阶段才发送出去广播,所以你上面的提议的确是正确的。非常不错。


谢谢你的提议,后续我会纳入到优化代码中去。


祝课程学习愉快~

1
2
Qiujuer
回复
alexnest3882392
优秀~赞
2019-03-27
共2条回复

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

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

2316 学习 · 476 问题

查看课程