@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;
  }
@ 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 ; }
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