JAVA 使用 类 在线程之间同步操作
JAVA synchronize operations between threads using classes
我目前正在尝试创建一种可靠的 UDP 协议,其中我的服务器向我的客户端发送每个 1024 字节的数据包,当它完成一个 send/receive 周期时,服务器等待并且客户端发送一个命令到服务器的 TCP 告诉它什么数据包没有收到(我使用前 2 个字节作为数据包 ID [类型短]),然后服务器收到远程通知 class 并发送丢失的数据包。
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,我正在寻找一种仅在服务器开始 wait()
之后才调用 notify()
的方法,即使调用是在它开始等待
之前进行的
在我看来,您真正需要的是更高级别的并发原语。这里有一些可能性:
Semaphore
....最有可能
CyclicBarrier
CountDownLatch
或者可能是某种 Queue
或 Deque
.
问题(对我们来说)是我们无法看到您实际上是如何使用 wait / notify 方法的,因此不清楚您真正需要什么。
但作为一个一般原则,从长远来看,识别和使用适当的更高级别的并发性 class 比尝试实现自己的并发性要好来自基本构建块。
并且...正如@D.B 所指出的...在UDP 之上实施您自己的"reliable" 传输是在重新发明轮子。 TCP 是显而易见的选择,如果您这样做是为了获得 "better than TCP" 性能,还有其他选择。
我目前正在尝试创建一种可靠的 UDP 协议,其中我的服务器向我的客户端发送每个 1024 字节的数据包,当它完成一个 send/receive 周期时,服务器等待并且客户端发送一个命令到服务器的 TCP 告诉它什么数据包没有收到(我使用前 2 个字节作为数据包 ID [类型短]),然后服务器收到远程通知 class 并发送丢失的数据包。
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,我正在寻找一种仅在服务器开始 wait()
之后才调用 notify()
的方法,即使调用是在它开始等待
在我看来,您真正需要的是更高级别的并发原语。这里有一些可能性:
Semaphore
....最有可能CyclicBarrier
CountDownLatch
或者可能是某种 Queue
或 Deque
.
问题(对我们来说)是我们无法看到您实际上是如何使用 wait / notify 方法的,因此不清楚您真正需要什么。
但作为一个一般原则,从长远来看,识别和使用适当的更高级别的并发性 class 比尝试实现自己的并发性要好来自基本构建块。
并且...正如@D.B 所指出的...在UDP 之上实施您自己的"reliable" 传输是在重新发明轮子。 TCP 是显而易见的选择,如果您这样做是为了获得 "better than TCP" 性能,还有其他选择。