code: public WindowFuture offer(K key, R request, long offerTimeoutMillis) throws DuplicateKeyException, OfferTimeoutException, InterruptedException {
          return this.offer(key, request, offerTimeoutMillis, -1, false);
      }
docs: Offers a request for acceptance, waiting for the specified amount of time
  in case it could not immediately accepted. The "caller state hint" of
  the returned future will be set to "NOT_WAITING". The expireTimestamp of
  the returned future will be set to -1 (infinity/never expires).
  @param key The key for the request. A protocol's sequence number is a
  good choice.
  @param request The request to offer
  @param offerTimeoutMillis The amount of time (in milliseconds) to wait
  for the offer to be accepted.
  @return A future representing pending completion of the request
  @throws DuplicateKeyException Thrown if the key already exists
  @throws PendingOfferAbortedException Thrown if the offer could not be
  immediately accepted and the caller/thread was waiting, but
  the abortPendingOffers() method was called in the meantime.
  @throws OfferTimeoutException Thrown if the offer could not be accepted
  within the specified amount of time.
  @throws InterruptedException Thrown if the calling thread is interrupted
  while waiting to acquire the internal lock.