Java监视器:如何知道等待(长超时)是由超时还是由Notify()结束?
|
首先,这几乎是以下内容的重复:
如何区分等待(长时间超时)退出通知或超时的时间?
但这是一个新的后续问题。
具有以下等待声明:
public final native void wait(long timeout) throws InterruptedException;
它可能会因InterruptedException或超时而退出,或者由于Notify / NotifyAll方法是在另一个线程中调用而退出的,因此异常很容易捕获,但是...
我的代码绝对需要知道退出是出于超时还是通知。 (将来,此代码需要重新设计,但是现在无法完成。因此,我需要知道退出等待的原因。)
具体来说,有人可以举一个使用仅在notify()上设置为true的ThreadLocal布尔值的示例,并且所有这些都位于现有循环中的情况,如下所示? (这或多或少是另一个线程中公认的答案,但是没有给出特定的代码示例。我对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();
}
布尔值\“ empty \”的作用超出了我在此处提出的特定问题。我相信我将需要添加另一个布尔值来满足原始问题的建议答案。我如何将建议的解决方案集成到上面的现有代码段中?谢谢。
没有找到相关结果
已邀请:
4 个回复
诉嘎归亮
(及其
方法)而不是内置监视器可能会更好,因为
返回的
值表示等待是否超时。 即使这样,您也必须提防虚假唤醒(与调用
并没有区别。)
烷刨画颠离
是否超时,都应该像现在一样使用循环-部分是由于可能会产生虚假唤醒。但是,我完全不确定您是否真的需要知道呼叫是否由于通知而退出。 考虑通知发生在超时之前一纳秒的情况与通知发生在超时之后一纳秒的情况。两者之间的有用区别是什么?如果这两者在“大约同一时间”发生,则从根本上说存在竞争条件。 据我所知,ѭ8确实不能告诉您调用是否超时,但这不会影响您的代码。无论如何,您应该循环并测试通知的副作用。 坦白说,我不清楚ѭ9会在哪里发挥作用-这与您想要的相反,如果您需要能够从等待线程中知道通知线程是否已到达某一点。我认为您根本不需要一个额外的变量-您的10英镑就可以了。
捕暑句簿姓
和其他功能:
当然,这不一定是一个好方法。如果恰好在调用before13ѭ之前超时,则信号条件可能会丢失。您确实应该在循环中等待,检查一些持久性状况。
超可林