Во-первых, это почти дубликат: Как определить, когда ожидание (длительный тайм-аут) завершается для уведомления или тайм-аута?
Но это новый дополнительный вопрос.
Имея это объявление ожидания:
public final native void wait(long timeout) throws InterruptedException;
Он мог выйти по InterruptedException или по таймаут, или потому что метод Notify / NotifyAll был вызван в другом потоке, исключение легко поймать, но ...
Моему коду абсолютно необходимо знать, был ли выход из тайм-аута или из уведомления. (В будущем этот код необходимо переработать, но сейчас это невозможно. Поэтому мне нужно знать причину выхода из режима ожидания.)
В частности, может ли кто-нибудь привести пример из используя логическое значение ThreadLocal, для которого установлено значение true только в notify (), и где все это находится внутри существующего цикла, как показано ниже? (Это был более или менее принятый ответ в другом потоке, но не было конкретного примера кода. Я ' Я не очень хорошо знаком с 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» служит цели, выходящей за рамки конкретного вопроса, который я здесь задаю. Я считаю, что мне нужно будет добавить еще одно логическое значение, чтобы выполнить предложенный ответ из исходного вопроса. Как мне интегрировать это предложенное решение в существующий фрагмент кода выше? Спасибо.