gpt4 book ai didi

Java同步-等待来自服务器的数据

转载 作者:行者123 更新时间:2023-11-30 07:11:24 25 4
gpt4 key购买 nike

我有一个典型的服务器/客户端问题,其中一个类定期等待来自服务器的数据更新。简而言之,我的程序如下:

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();
}

它基本上是一个信号量,但更好。仅当锁存器倒数为零(或线程被中断)时,Await 才会继续。如果您需要重置计数的功能,请考虑使用CyclicBarrier(其工作原理大致相同,但有一个reset方法)

关于Java同步-等待来自服务器的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39185924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com