docs: public IAsyncFuture read(ByteBuffer[] bufs, long timeout,
                               boolean forceQueue, long bytesRequested, boolean useJITBuffer,
                               VirtualConnection vci, boolean asyncIO) {
          if (timeout < 0) {
              throw new IllegalArgumentException();
          }
          IAsyncFuture future = read(bufs, forceQueue, bytesRequested,
                                     useJITBuffer, vci, asyncIO);
  
          // don't lock the getCompletedSemaphore here, wait till later
          if (future != null && !future.isCompleted() && timeout > 0) {
              createTimeout(future, timeout, true);
          }
          return future;
      }