code: Future<Channel> acquire() {
          final Promise<Channel> acquirePromise = new DefaultPromise<>(this.executor);
  
          if (this.executor.inEventLoop()) {
              this.acquireWithinEventExecutor(acquirePromise);
          } else {
              this.executor.submit(new Runnable() {
                  @Override
                  public void run() {
                      ApnsChannelPool.this.acquireWithinEventExecutor(acquirePromise);
                  }
              }).addListener(new GenericFutureListener() {
                  @Override
                  public void operationComplete(final Future future) throws Exception {
                      if (!future.isSuccess()) {
                          acquirePromise.tryFailure(future.cause());
                      }
                  }
              });
          }
  
          return acquirePromise;
      }
docs: <p>Asynchronously acquires a channel from this channel pool. The acquired channel may be a pre-existing channel
  stored in the pool or may be a new channel created on demand. If no channels are available and the pool is at
  capacity, acquisition may be delayed until another caller releases a channel to the pool.</p>
  
  <p>When callers are done with a channel, they <em>must</em> release the channel back to the pool via the
  {@link ApnsChannelPool#release(Channel)} method.</p>
  
  @return a {@code Future} that will be notified when a channel is available
  
  @see ApnsChannelPool#release(Channel)