Подтвердить что ты не робот

Поведение future.get с 0 таймаутом

Может ли кто-нибудь указать мне на какую-то документацию, в которой ясно, что "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();
   }
4b9b3361

Ответ 1

Ожидает, если это необходимо в течение не более указанного времени & hellip;

Ожидание не более нуля единиц времени не ждет вообще. Это не явный намек, это явная гарантия.

Ответ 2

Я могу указать вам на какой-то код, если это поможет. Заглядывая в 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 наносекунду.