【发布时间】:2011-09-01 03:24:00
【问题描述】:
首先,这是几乎重复的: 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 很容易捕获,但是......
我的代码绝对需要知道退出是来自超时还是通知。 (以后需要重新设计这段代码,但现在做不到。所以我需要知道退出等待的原因。)
具体来说,有人可以给出一个 example 使用仅在 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();
}
布尔“空”的用途超出了我在这里提出的具体问题。我相信我需要添加另一个布尔值来满足原始问题的建议答案。我如何将该提议的解决方案集成到上面的现有代码 sn-p 中?谢谢。
【问题讨论】:
-
您要求队列类似的行为。检查 java.util.concurrent.BlockingQueue 及其任何实现。
标签: java multithreading wait notify