Как дифференцироваться, когда ожидают (долгий тайм-аут), выход для уведомляет или тайм-аут?

30
задан Hernán Eche 3 August 2010 в 15:17
поделиться

6 ответов

Вы не сможете отличить их друг от друга, если не предоставите дополнительный код. Например, добавив ThreadLocal Boolean , для которого установлено значение true только в notify ()

, но сначала вы должны убедиться, что ваша логика требует этого дифференцирования.

11
ответ дан 27 November 2019 в 23:59
поделиться

Это не совсем отвечает на вопрос, но, вероятно, решит вашу проблему: используйте механизмы параллелизма более высокого уровня. Ожидание / уведомление обычно более низкого уровня, чем вы хотели бы, по этой причине среди многих других.

Например, если вы использовали BlockingQueue.poll(long, TimeUnit) , вы можете проверить, является ли результат нулевым, чтобы узнать, истекло ли время.

13
ответ дан Mr_and_Mrs_D 27 November 2019 в 23:59
поделиться

Вы не должны использовать подход ожидания / уведомления.

Будет лучше использовать 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

1
ответ дан Aleksandr Filichkin 27 November 2019 в 23:59
поделиться

Есть еще одна причина, по которой уведомление может возвращаться: ложное пробуждение. Это маловероятно, но возможно, потому что предотвращение ложных пробуждений очень дорого обходится для некоторых комбинаций оборудования и ОС.

Из-за этого вы всегда должны вызывать wait () в цикле и повторно проверять условие, которое вы ожидаете. Во время этой работы легко одновременно проверить таймаут.

Для подробностей я рекомендую книгу «Java Concurrency In Practice». И используя конструкции более высокого уровня, которые сделают все правильно для вас.

16
ответ дан 27 November 2019 в 23:59
поделиться

Исключение не генерируется при уведомлении и тайм-ауте.

Я думаю, что лучше полагаться на java.lang.concurrent объекты синхронизации пакетов вместо использования Object.wait () .

1
ответ дан 27 November 2019 в 23:59
поделиться

Невозможно указать напрямую - то есть вам придется добавить дополнительный код, чтобы определить это. Часто, когда вы ждете (), вы ждете, когда что-то произойдет, что каким-то образом изменит состояние объекта - например, возможно, установив логическую переменную. В этом случае вы можете просто проверить состояние этой переменной, чтобы узнать, произошло ли событие, или вы просто истекли по тайм-ауту. Или вы можете посмотреть значение System.currentTimeMillis (), чтобы увидеть, что истекшее время больше или равно периоду тайм-аута - если это так, это будет подсказкой, что у вас, вероятно, истекло время ожидания (хотя это не абсолютная гарантия ). Или, если прошедшее время меньше периода тайм-аута, то вы определенно не истекли. Это поможет?

2
ответ дан 27 November 2019 в 23:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: