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