Вы не сможете отличить их друг от друга, если не предоставите дополнительный код. Например, добавив ThreadLocal
Boolean
, для которого установлено значение true
только в notify ()
, но сначала вы должны убедиться, что ваша логика требует этого дифференцирования.
Это не совсем отвечает на вопрос, но, вероятно, решит вашу проблему: используйте механизмы параллелизма более высокого уровня. Ожидание / уведомление обычно более низкого уровня, чем вы хотели бы, по этой причине среди многих других.
Например, если вы использовали BlockingQueue.poll(long, TimeUnit)
, вы можете проверить, является ли результат нулевым, чтобы узнать, истекло ли время.
Вы не должны использовать подход ожидания / уведомления.
Будет лучше использовать Lock with Condidions https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.html#await-long-java. util.concurrent.TimeUnit-
Ожидает тайм-аут и вернет false, если время ожидания заметно истекло до возврата из метода, в противном случае - true
Есть еще одна причина, по которой уведомление может возвращаться: ложное пробуждение. Это маловероятно, но возможно, потому что предотвращение ложных пробуждений очень дорого обходится для некоторых комбинаций оборудования и ОС.
Из-за этого вы всегда должны вызывать wait () в цикле и повторно проверять условие, которое вы ожидаете. Во время этой работы легко одновременно проверить таймаут.
Для подробностей я рекомендую книгу «Java Concurrency In Practice». И используя конструкции более высокого уровня, которые сделают все правильно для вас.
Исключение не генерируется при уведомлении и тайм-ауте.
Я думаю, что лучше полагаться на java.lang.concurrent
объекты синхронизации пакетов вместо использования Object.wait ()
.
Невозможно указать напрямую - то есть вам придется добавить дополнительный код, чтобы определить это. Часто, когда вы ждете (), вы ждете, когда что-то произойдет, что каким-то образом изменит состояние объекта - например, возможно, установив логическую переменную. В этом случае вы можете просто проверить состояние этой переменной, чтобы узнать, произошло ли событие, или вы просто истекли по тайм-ауту. Или вы можете посмотреть значение System.currentTimeMillis (), чтобы увидеть, что истекшее время больше или равно периоду тайм-аута - если это так, это будет подсказкой, что у вас, вероятно, истекло время ожидания (хотя это не абсолютная гарантия ). Или, если прошедшее время меньше периода тайм-аута, то вы определенно не истекли. Это поможет?