code: public void executeAsync(Supplier<CompletionStage<Void>> asyncCommand) {
        execute(() -> {
           CompletionStage<Void> future = asyncCommand.get();
           // The current permit will be released automatically
           // If the future is null, don't reserve another permit
           assert future != null;
           removePermit();
           future.whenComplete(runner);
        });
     }
docs: Similar to {@link #execute(Runnable)}, but the task can continue executing asynchronously,
  without blocking the OS thread, while still counting against this executor's limit.
  
  @param asyncCommand A task that returns a non-null {@link CompletionStage},
  which may be already completed or may complete at some point in the future.