我有一个集成测试需要协调两个DatagramSockets,每个都在自己的线程中运行。一个套接字等待通过阻塞调用receive()来读取数据。另一个套接字需要调用send(),但这必须在receive()被阻塞后发生,否则数据将丢失。
代码有点像这样:
接收机
byte[] buf = new byte[1024];
new DatagramSocket(7654).receive(new DatagramPacket(buf, buf.length));
发件人
new DatagramSocket(7654).send(
new DatagramPacket("hello".getBytes(Charset.forName("UTF-8")), 5));
我不愿在send()调用之前放置一个Thread.sleep(),尽管这可能足以让接收器阻塞。是否有一种优雅的方式来做到这一点?
答案 0 :(得分:1)
在send()之前等待信号量。在receive()调用之前发出一个单元的信号。鉴于网络延迟,如果UDP回复在进行receive()调用和rx套接字设置之前返回,我会感到惊讶。您可以通过提高接收线程的优先级来确保(或降低发送线程的优先级)。
您可以在send()之后等待另一个信号量,并在receive()之后发出信号,因此确保发送线程在rx完成之前不会再次尝试发送。不确定如何检测通信失败,IIRC,Java信号量等待没有超时:((
RGDS, 马丁