code: @NonNull
    public Caffeine<K, V> executor(@NonNull Executor executor) {
      requireState(this.executor == null, "executor was already set to %s", this.executor);
      this.executor = requireNonNull(executor);
      return this;
    }
docs: Specifies the executor to use when running asynchronous tasks. The executor is delegated to
  when sending removal notifications, when asynchronous computations are performed by
  {@link AsyncLoadingCache} or {@link LoadingCache#refresh} or {@link #refreshAfterWrite}, or
  when performing periodic maintenance. By default, {@link ForkJoinPool#commonPool()} is used.
  <p>
  The primary intent of this method is to facilitate testing of caches which have been
  configured with {@link #removalListener} or utilize asynchronous computations. A test may
  instead prefer to configure the cache to execute tasks directly on the same thread.
  <p>
  Beware that configuring a cache with an executor that throws {@link RejectedExecutionException}
  may experience non-deterministic behavior.
  
  @param executor the executor to use for asynchronous execution
  @return this {@code Caffeine} instance (for chaining)
  @throws NullPointerException if the specified executor is null