Мониторы Java: как узнать, закончилось ли ожидание (длительный тайм-аут) по таймауту или по Notify ()?

Во-первых, это почти дубликат: Как определить, когда ожидание (длительный тайм-аут) завершается для уведомления или тайм-аута?

Но это новый дополнительный вопрос.

Имея это объявление ожидания:

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» служит цели, выходящей за рамки конкретного вопроса, который я здесь задаю. Я считаю, что мне нужно будет добавить еще одно логическое значение, чтобы выполнить предложенный ответ из исходного вопроса. Как мне интегрировать это предложенное решение в существующий фрагмент кода выше? Спасибо.

6
задан Community 23 May 2017 в 11:53
поделиться