采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
请教下老师,为什么先UDPSearche在启动UDPProvider,两个线程就会阻塞呢?
不对哦 两个线程?可以截图一下么? 理论来说如果没有启动提供者,去搜索也是没有意义的。 所以是先启动提供者,然后启动搜索。
是不是DatagramPacket.receive方法阻塞了、点进去看了下源码,说这个方法是会阻塞。。。。。
哦 你说的这个哦 这个不是死锁。 这个是两个不同进程了,不是同进程之间的线程死锁。
两个都不忘下走 只是因为两者都是使用的同步io,现在等于是在等待io返回而已。
但是又因为两者顺序不同完美的错过了,所以永远等不到数据到来。
正确的顺序是:提供者开启,并进入接收数据等待 搜索者开启,并进入发布数据状态,然后等待返回 此时提供者等待到了数据,所以接收数据,消费数据,并且返回数据 然后搜索者得到返回数据,之后搜索者继续走后面的逻辑。
正确的顺序是:
提供者开启,并进入接收数据等待 搜索者开启,并进入发布数据状态,然后等待返回 此时提供者等待到了数据,所以接收数据,消费数据,并且返回数据
然后搜索者得到返回数据,之后搜索者继续走后面的逻辑。
而顺序错了就成了: 搜索者发送数据,然后等待数据回来 提供者开启,等待到达数据;但是由于发送者在提供者启动之前就把数据发送了,所以提供者不可能等到数据了,也就不会回送数据了。 所以搜索者也得不到数据了,然后两者就都GG了。
而顺序错了就成了: 搜索者发送数据,然后等待数据回来 提供者开启,等待到达数据;但是由于发送者在提供者启动之前就把数据发送了,所以提供者不可能等到数据了,也就不会回送数据了。
所以搜索者也得不到数据了,然后两者就都GG了。
大概就是这样子
哦 你说的这个哦 这个不是死锁。 这个是两个不同进程了,不是同进程之间的线程死锁。 两个都不忘下走 只是因为两者都是使用的同步io,现在等于是在等待io返回而已,但是又因为两者顺序不同完美的错过了,所以永远等不到数据到来。 正确的顺序是: 提供者开启,并进入接收数据等待 搜索者开启,并进入发布数据状态,然后等待返回 此时提供者等待到了数据,所以接收数据,消费数据,并且返回数据 然后搜索者得到返回数据,之后搜索者继续走后面的逻辑。 而顺序错了就成了: 搜索者发送数据,然后等待数据回来 提供者开启,等待到达数据;但是由于发送者在提供者启动之前就把数据发送了,所以提供者不可能等到数据了,也就不会回送数据了。 所以搜索者也得不到数据了,然后两者就都GG了。
格式丢失了,所以我在上面回复了一下。
先启动provider然后再启动searche
登录后可查看更多问答,登录/注册
理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选
2.7k 1
1.8k 7
1.6k 5
1.9k 13
1.0k 13