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

时间:2016-09-13 14:04:31

标签: 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); (假设我在两种情况下都使用相同的执行程序)

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

如果我使用默认CompletableFuture的{​​{1}} API(没有执行者的方法),会有什么不同?

3 个答案:

答案 0 :(得分:20)

  

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

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

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

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

这实际上取决于你想做什么。

  

如果我将CompletableFutureApi与默认的Executor(没有执行者的方法)一起使用,会有什么不同?

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

如果CPU密集,那么使用commonPool最有意义。

答案 1 :(得分:1)

CompletableFuture具有丰富的功能,如链接多个期货,组合期货,执行未来执行后的某些操作(同步和异步)等。

但是,就性能而言,CompletableFuture与Future没有什么不同。即使组合CompletableFuture的多个实例(最后使用.thenCombine和.join),除非我们调用.get方法,否则它们都不会被执行,在此期间,调用线程被阻止。我觉得在性能方面,这并不比Future好。

如果我在这里遗漏某些表现,请告诉我。

答案 2 :(得分:0)

这为我澄清了未来可以完善的未来之间的区别:Difference between Future and Promise

CompletableFuture更像是一个承诺。

相关问题