Обратите внимание: поскольку отмена может произойти в любое время, истинное возвращение не гарантирует, что какой-либо другой поток когда-либо получит эту блокировку. Этот метод предназначен в первую очередь для мониторинга состояния системы.
Я понимаю, что небезопасно полагаться на возвращаемое значение hasQueuedThreads()< /code>, если другие потоки могут вызывать, например. lockInterruptible() или tryLock(timeout), но применимо ли это предупреждение, даже если я могу гарантировать, что все потоки будут вызывать только lock()?
Проблема, которая привела меня к этому вопросу, заключается в следующем: у меня есть несколько потоков, которым, возможно, придется взаимодействовать с внешним устройством. Перед тем, как к нему можно будет получить доступ, это устройство необходимо включить, но по возможности его следует переводить в режим сна, чтобы сохранить заряд батареи. Итак, я бы хотел, чтобы потоки имели следующее поведение:
- Каждый раз, когда поток хочет получить доступ к устройству, он получает блокировку (с помощью lock()< /code>).
- После получения блокировки поток при необходимости включает устройство, а затем делает то, что должен.
- После завершения потока он проверяет, ожидает ли какой-либо другой поток блокировки. Если да, то устройство остается включенным, если нет, то оно выключается.
Другая конструкция, которую я рассматривал, заключается в том, что все потоки будут отправлять свои рабочие нагрузки в один поток драйвера, но это похоже на вход в ад обратного вызова, поэтому я бы предпочел туда не ходить
Подробнее здесь: https://stackoverflow.com/questions/790 ... bly-at-all