我正在尝试创建一种可靠的UDP协议,我的服务器每次向我的客户端发送1024字节的数据包,当它完成服务器等待的发送/接收周期,客户端通过TCP向服务器发送命令告诉它没有接收到什么数据包(我使用前2个字节作为数据包id [类型为short]),服务器比远程类通知并发送丢失的数据包。
private void waitUntilNotified() {
synchronized (this) {
try {
System.out.println("Waiting..." + new Date());
waiting = true;
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Stop waiting");
}
}
public void notifyThis(){
synchronized (this) {
if(waiting){
waiting = false;
notify();
System.out.println("Notified " + new Date());
return;
}
}
}
我的问题是,有时在本地测试时,命令会在服务器开始等待之前到达,因此会导致它永远等待。
如果有一种万无一失的方法可以确保即使触发notifyThis()
的命令在服务器触发waitUntilNotified()
功能之前到来,它仍然会通知它并改变等待状态?
如果有任何不明确的评论,我会尝试解释它。
TL:DR,我正在寻找一种方法只在服务器启动notify()
之后调用wait()
,即使在开始等待之前进行了呼叫
答案 0 :(得分:1)
在我看来,真正需要的是更高级别的并发原语。以下是一些可能性:
Semaphore
....很可能CyclicBarrier
CountDownLatch
或可能某种Queue
或Deque
。
问题(对我们而言)是我们无法看到您实际使用等待/通知方法的方式,因此不清楚您真正需要什么。
但作为通用原则从长远来看,识别和使用适当的更高级别的并发类比尝试从基本构建块实现自己的并发更好。
而且......正如@ D.B所说的那样......实施自己的"可靠的" UDP顶部的传输正在重新发明轮子。 TCP是显而易见的替代方案,如果你这样做是为了更好地比TCP"表现,还有其他选择。