gpt4 book ai didi

Java并发 - 虚假唤醒和等待(超时)

转载 作者:行者123 更新时间:2023-11-29 04:48:15 24 4
gpt4 key购买 nike

我了解到,当等待一个对象时,条件应该放在一个循环中,而不是放在一个if 条件 中。这样做的原因之一是为了避免可能发生的各种虚假唤醒调用。

例如:

synchronized (obj) {
while (condition is false) {
obj.wait(5 * 1000);
}
... do something ...
}

但是,我只想等待 5 秒,让线程得到通知。在上面的代码中,线程等待 5 秒。但在那段时间之后,如果条件仍然为假,我们将再次等待。如果我有以下内容,情况就不会是这样了:

synchronized (obj) {
if (condition is false) {
obj.wait(5 * 1000);
}
... do something ...
}

但这与我们应该使用循环而不是单个 if 条件的准则相矛盾!

这是怎么解决的?

最佳答案

我通常是这样处理的:

long timeout = ....;
synchronized(obj) {
long start = System.currentTimeMillis();
while(!condition && (timeout > 0)) {
obj.wait(timeout);
long now = System.currentTimeMillis();
timeout -= (now - start);
start = now;
}
}

关于Java并发 - 虚假唤醒和等待(超时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36363120/

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