gpt4 book ai didi

Java 监视器 : How to know if wait(long timeout) ended by timeout or by Notify()?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:51:41 25 4
gpt4 key购买 nike

首先,这是一个几乎重复的: How to differentiate when wait(long timeout) exit for notify or timeout?

但这是一个新的后续问题。

有这个等待声明:

public final native void wait(long timeout) throws InterruptedException;

它可能会因 InterruptedException 或超时而退出,或者因为在另一个线程中调用了 Notify/NotifyAll 方法,Exception 很容易捕获但是...

我的代码绝对需要知道退出是超时还是通知。 (以后这段代码需要重新设计,但是现在做不到,所以需要知道退出wait的原因。)

具体来说,有人可以给出一个示例,使用仅在 notify() 上设置为 true 的 ThreadLocal boolean 值,并且所有这些都在现有循环中,如下所示? (这或多或少是另一个线程中接受的答案,但没有给出具体的代码示例。我对 Java 不是很熟悉,所以我需要一个具体的代码示例——最好是在下面现有代码的上下文中.)

public synchronized int getLastSequenceNumber() {
while (empty) {
try {
wait(waitTimeValue);
} catch (InterruptedException e) {}
}
empty = true;
return reportedSequenceNumber;
}
public synchronized void reconcileLastSequenceNumber(int sequenceNumber) {
empty = false;
this.reportedSequenceNumber = sequenceNumber;
notifyAll();
}

boolean “空”的用途超出了我在这里提出的具体问题。我相信我需要添加另一个 boolean 值来完成原始问题的建议答案。我如何将建议的解决方案集成到上面的现有代码片段中?谢谢。

最佳答案

您最好使用 Condition (及其 await 方法)而不是内置监视器,因为 await 返回一个 boolean 值,指示等待是否超时。

即便如此,您也必须提防虚假唤醒(这与调用 signal 无法区分。)

关于Java 监视器 : How to know if wait(long timeout) ended by timeout or by Notify()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6114320/

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