code: E getBlockingUntilAvailableOrTimeout(final PoolKey<K> key, final long timeout, final TimeUnit unit, final PoolWaitFuture<E> future) throws InterruptedException, TimeoutException {
  
  		Date deadline = null;
  		if (timeout > 0) {
  			deadline = new Date(System.currentTimeMillis() + unit.toMillis(timeout));
  		}
  		lock.lock();
  		try
  		{
  			E entry = null;
  			for(;;) 
  			{
  				validateShutdown();
  				entry = createOrAttemptToBorrow(key);
  
  				if (entry != null) 
  					return entry.flagOwner();
  
  				if (!await(future, key, deadline) && deadline != null && deadline.getTime() <= System.currentTimeMillis())  break;
  
  			}
  			throw new TimeoutException("Timeout waiting for Pool for Key: " + key);
  		}
  		finally {
  			lock.unlock();
  		}
  	}
docs: Internal: Blocks until the object to be borrowed based on the key is available or until the max timeout specified has lapsed.
  
  @param key the Pool Key used to lookup the Object to borrow
  @param timeout the maximum time to wait
  @param unit the time unit of the timeout argument
  @param future the current future waiting on the object to become available
  @return the Object which was successfully borrowed.
  @throws InterruptedException if the thread was interrupted
  @throws IllegalStateException if the pool has been shutdown
  @throws TimeoutException if the wait timed out