Ответ 1
Ожидает, если это необходимо в течение не более указанного времени & hellip;
Ожидание не более нуля единиц времени не ждет вообще. Это не явный намек, это явная гарантия.
Может ли кто-нибудь указать мне на какую-то документацию, в которой ясно, что "Future.get" с таймаутом 0 не будет ждать?
В документах API для java.util.concurrent.Future
не указано явно поведение future.get(0, unit)
. Постояв сам по себе, утверждение "Ожидает, если понадобится в течение максимально определенного времени..." подразумевает, что этот вызов не будет ждать вообще, но учитывая давнее поведение Object.wait(0)
(бесконечное ожидание), я нервничаю чтобы зависеть от поведения "нет ожидания" future.get(0, unit)
Сканирование источника некоторых классов, предоставляемых JDK (т.е. FutureTask
) Я вижу, что эта конкретная реализация Future
не ждет, когда таймаут равен 0.
Я хотел бы сказать
long timeout = Math.max(until - now, 0);
return future.get(timeout, TimeUnit.MILLISECONDS);
но я нервничаю из-за того, что будущее реализует это как бесконечное ожидание, поэтому вместо этого я явно закодировал его так, как я ожидал, что он будет работать:
long timeout = Math.max(until - now, 0);
if(timeout > 0 || future.isDone()){
return future.get(timeout, TimeUnit.MILLISECONDS);
} else {
throw TimeoutException();
}
Ожидает, если это необходимо в течение не более указанного времени & hellip;
Ожидание не более нуля единиц времени не ждет вообще. Это не явный намек, это явная гарантия.
Я могу указать вам на какой-то код, если это поможет. Заглядывая в java.util.concurrent.FutureTask
, а затем на AbstractQueuedSynchronizer
, я вижу следующий цикл, который я рассмотрел, чтобы показать relavent bits:
private boolean doAcquireSharedNanos(int arg, long nanosTimeout) {
long lastTime = System.nanoTime();
for (;;) {
...
if (nanosTimeout <= 0) {
cancelAcquire(node);
return false;
}
long now = System.nanoTime();
nanosTimeout -= now - lastTime;
}
Это означает, что если nanosTimeout
равно 0 (что будет, если вы пройдете в 0, чтобы получить), то он попытается получить будущее один раз, а затем тайм-аут и вернуть false.
Если вам становится лучше, вы можете установить тайм-аут на 1 наносекунду.