ExecutorService.submit(Task)vs CompletableFuture.supplyAsync(Task,Executor)

der*_*itz 32 java concurrency future completable-future

要并行或异步运行一些东西我可以使用ExecutorService:<T> Future<T> submit(Runnable task, T result);或CompletableFuture Api :( static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor); 假设我在两种情况下使用相同的Executor)

除了返回类型FutureCompletableFuture存在任何显着差异.或何时使用什么?

如果我使用CompletableFuture默认的API Executor(没有执行程序的方法)有什么区别?

Joh*_*int 21

除了返回类型Future vs. CompletableFuture之外,还有任何显着的差异.或何时使用什么?

这真的很简单.您可以使用Future您希望执行线程等待异步计算响应的时间.一个例子是并行合并/排序.异步排序,同步排序,等待左边完成(future.get()),合并结果.

CompleteableFuture当您希望执行某些操作时,使用a ,结果在完成后,从执行的线程异步执行.例如:我想异步进行一些计算,当我计算时,将结果写入某个系统.请求线程可能不需要等待结果.

您可以在单个Future可执行文件中模仿上面的示例,但它CompletableFuture提供了更流畅的界面和更好的错误处理.

这真的取决于你想做什么.

如果我使用CompletableFutureApi和默认的Executor(没有执行程序的方法)有什么区别?

它将委派给ForkJoin.commonPool()系统上的CPU数量的默认大小.如果您正在执行IO密集型操作(读取和写入文件系统),则应以不同方式定义线程池.

如果它是CPU密集型的,那么使用commonPool最有意义.

  • 这个答案并没有说清楚为什么你想要"未来"."CompletableFuture"(后续动作的异步触发)的优点是独一无二的,但"未来"没有优势 - "等待结果"同样适用于"CompletableFuture". (2认同)
  • 我认为 @dermoritz 是在问 ExecutorService 与 CompletableFuture 之间的区别,而不是 Future 与 CompletableFuture 之间的区别。 (2认同)