Чтобы запускать некоторые вещи параллельно или асинхронно, я могу использовать либо ExecutorService: <T> Future<T> submit(Runnable task, T result);
, либо CompletableFuture Api: static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor);
(Предположим, что я использую в обоих случаях тот же Исполнитель)
Помимо возвращаемого типа Future vs. CompletableFuture есть ли какие-либо примечательные отличия. Или Когда использовать что?
И каковы различия, если я использую CompletableFutureApi со стандартным Executor (метод без исполнителя)?