code: public WindowFuture<K,R,P> complete(K key, P response) throws InterruptedException {
          if (response == null) {
              throw new IllegalArgumentException("Null responses are illegal. Use cancel() instead.");
          }
          
          if (!this.futures.containsKey(key)) {
              return null;
          }
  
          this.lock.lockInterruptibly();
          try {
              // try to remove future from window
              DefaultWindowFuture<K,R,P> future = this.futures.remove(key);
              if (future == null) {
                  return null;
              }
              
              // set success using helper method (bypasses signalAll and requests.remove(key))
              future.completeHelper(response, System.currentTimeMillis());
  
              // signal that a future is completed
              this.completedCondition.signalAll();
  
              return future;
          } finally {
              this.lock.unlock();
          }
      }
docs: Successfully completes a request by setting the response on the associated future.
  Any callers/threads waiting for completion will be signaled. Also, since
  this frees up a slot in the window, one caller/thread blocked with a
  pending offer will be signaled to continue.
  @param key The key for the original request
  @param response The response to set on the associated future. Null
  responses are not accepted (use cancel()) instead.
  @return A future representing the entire operation. Since a response is
  set, the future.isSuccess() method will be true.
  @throws InterruptedException Thrown if the calling thread is interrupted
  and we're currently waiting to acquire the internal "windowLock".