请稍等 ...
×

采纳答案成功!

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

UDPProvider和UDPSearcher的启动顺序

请教下老师,为什么先UDPSearche在启动UDPProvider,两个线程就会阻塞呢?

正在回答

4回答

不对哦 两个线程?可以截图一下么?
理论来说如果没有启动提供者,去搜索也是没有意义的。
所以是先启动提供者,然后启动搜索。

0 回复 有任何疑惑可以回复我~
  • 提问者 黎明的烬 #1
    是不是DatagramPacket.receive方法阻塞了、点进去看了下源码,说这个方法是会阻塞。。。。。
    回复 有任何疑惑可以回复我~ 2018-10-24 18:50:00
Qiujuer 2018-10-24 21:03:07

哦 你说的这个哦 这个不是死锁。 这个是两个不同进程了,不是同进程之间的线程死锁。 

两个都不忘下走 只是因为两者都是使用的同步io,现在等于是在等待io返回而已。

但是又因为两者顺序不同完美的错过了,所以永远等不到数据到来。 

正确的顺序是:

提供者开启,并进入接收数据等待 
搜索者开启,并进入发布数据状态,然后等待返回 
此时提供者等待到了数据,所以接收数据,消费数据,并且返回数据 

然后搜索者得到返回数据,之后搜索者继续走后面的逻辑。 


而顺序错了就成了: 
搜索者发送数据,然后等待数据回来 
提供者开启,等待到达数据;但是由于发送者在提供者启动之前就把数据发送了,所以提供者不可能等到数据了,也就不会回送数据了。 

所以搜索者也得不到数据了,然后两者就都GG了。

1 回复 有任何疑惑可以回复我~
提问者 黎明的烬 2018-10-24 18:42:39

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

//img1.sycdn.imooc.com//szimg/5bd04c8a0001f44b18200908.jpg

大概就是这样子

0 回复 有任何疑惑可以回复我~
  • Qiujuer #1
    哦 你说的这个哦 这个不是死锁。
    这个是两个不同进程了,不是同进程之间的线程死锁。
    两个都不忘下走 只是因为两者都是使用的同步io,现在等于是在等待io返回而已,但是又因为两者顺序不同完美的错过了,所以永远等不到数据到来。
    
    正确的顺序是:
    提供者开启,并进入接收数据等待
    搜索者开启,并进入发布数据状态,然后等待返回
    此时提供者等待到了数据,所以接收数据,消费数据,并且返回数据
    然后搜索者得到返回数据,之后搜索者继续走后面的逻辑。
    
    而顺序错了就成了:
    搜索者发送数据,然后等待数据回来
    提供者开启,等待到达数据;但是由于发送者在提供者启动之前就把数据发送了,所以提供者不可能等到数据了,也就不会回送数据了。
    
    所以搜索者也得不到数据了,然后两者就都GG了。
    回复 有任何疑惑可以回复我~ 2018-10-24 21:01:59
  • Qiujuer #2
    格式丢失了,所以我在上面回复了一下。
    回复 有任何疑惑可以回复我~ 2018-10-24 21:03:42
不想做程序猿 2018-10-24 15:15:38

先启动provider然后再启动searche

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信