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 方法)