Поведение future.get с 0 таймаутом
-
27-10-2019 - |
Вопрос
Может ли кто-нибудь указать мне на какую-то документацию, в которой четко указано, что Future.get с таймаутом 0 ждать не будет?
В документации API для java.util.concurrent.Future
не указано явным образом поведение future.get(0, unit)
.Само по себе утверждение «Ожидает, если необходимо, самое большее заданное время ...» подразумевает, что этот вызов вообще не будет ждать, но, учитывая длительное поведение Object.wait(0)
(бесконечное ожидание), я нервничаю, чтобы зависетьо поведении генерального кодового тега "без ожидания"
Просматривая источник некоторых классов, предоставляемых JDK (например, future.get(0, unit)
), я вижу, что эта конкретная реализация FutureTask
не ждет, когда тайм-аут равен 0.
Я бы хотел сказать
родовое словоно я нервничаю из-за того, что будущее реализует это как бесконечное ожидание, поэтому вместо этого я явно закодировал его так, как я ожидал, что это будет работать:
родовое словоРешение
При необходимости ожидает самое большее заданное время…
Ожидание не более нулевых единиц времени вообще не означает ожидания.Это не подразумеваемый намек, это явная гарантия.
Другие советы
Может ли кто-нибудь указать мне на какую-то документацию, в которой четко указано, что Future.get с таймаутом 0 ждать не будет?
Я могу указать вам на код, если это поможет.Заглянув в java.util.concurrent.FutureTask
, а затем на AbstractQueuedSynchronizer
, я вижу следующий цикл, который я сократил, чтобы показать соответствующие биты:
Это означает, что если nanosTimeout
равен 0 (что будет, если вы передадите 0 для получения), то он попытается получить будущее один раз, а затем тайм-аут и вернет false.
Если вам станет легче, вы можете установить время ожидания равным 1 наносекунде.