Java 同步 - 等待来自服务器的数据
Java synchronization - waiting for data from server
我有一个 classic 服务器/客户端问题,其中 class 正在等待服务器定期更新数据。简而言之,我的程序如下:
public synchronized void eodProcess() {
//DO STUFF
dataReady = false;
while (!dataReady) {
try {
wait();
} catch (InterruptedException e) {
}
}
//DO STUFF
}
public void update(){
//CODE THAT DOWNLOADS FROM SERVER
synchronized(this){
dataReady = true;
notifyAll();
}
}
eodProcess() 和 update() 都安排在每天晚上的同一时间 运行。
现在上面的代码一直有效,因为数据下载需要几秒钟,但它似乎是错误的做事方式,因为理论上 update() 可以 运行 比 eodProcess() 更快,将 dataReady 设置为 true,然后 eodProcess 会将其设置为 False,然后永远等待。确保 eodProcess 等待数据准备就绪的正确方法是什么?
我正在考虑安排一个新进程,在这两种方法中的任何一个之前将 dataReady 设置为 false,并在 eodProcess 开始时删除初始化,但这似乎不太干净。
谢谢,
这是应用 CountDownLatch
有用的典型情况。
CountDownLatch downloadDone = new CountDownLatch(1);
[...]
public synchronized void eodProcess() {
//DO STUFF
downloadDone.await();
//DO STUFF
}
public void update(){
//CODE THAT DOWNLOADS FROM SERVER
downloadDone.countDown();
}
它基本上是一个信号量,但更好。只有当锁存器倒计时为零(或线程被中断)时,等待才会继续。如果您需要重置计数的能力,请考虑使用 CyclicBarrier
(它的工作原理大致相同,但有一个 reset
方法)
我有一个 classic 服务器/客户端问题,其中 class 正在等待服务器定期更新数据。简而言之,我的程序如下:
public synchronized void eodProcess() {
//DO STUFF
dataReady = false;
while (!dataReady) {
try {
wait();
} catch (InterruptedException e) {
}
}
//DO STUFF
}
public void update(){
//CODE THAT DOWNLOADS FROM SERVER
synchronized(this){
dataReady = true;
notifyAll();
}
}
eodProcess() 和 update() 都安排在每天晚上的同一时间 运行。
现在上面的代码一直有效,因为数据下载需要几秒钟,但它似乎是错误的做事方式,因为理论上 update() 可以 运行 比 eodProcess() 更快,将 dataReady 设置为 true,然后 eodProcess 会将其设置为 False,然后永远等待。确保 eodProcess 等待数据准备就绪的正确方法是什么?
我正在考虑安排一个新进程,在这两种方法中的任何一个之前将 dataReady 设置为 false,并在 eodProcess 开始时删除初始化,但这似乎不太干净。
谢谢,
这是应用 CountDownLatch
有用的典型情况。
CountDownLatch downloadDone = new CountDownLatch(1);
[...]
public synchronized void eodProcess() {
//DO STUFF
downloadDone.await();
//DO STUFF
}
public void update(){
//CODE THAT DOWNLOADS FROM SERVER
downloadDone.countDown();
}
它基本上是一个信号量,但更好。只有当锁存器倒计时为零(或线程被中断)时,等待才会继续。如果您需要重置计数的能力,请考虑使用 CyclicBarrier
(它的工作原理大致相同,但有一个 reset
方法)