要并行或异步运行某些东西我可以使用ExecutorService:<T> Future<T> submit(Runnable task, T result);
或CompletableFuture Api:static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor);
(假设我在两种情况下都使用相同的执行程序)
除了返回类型Future
与CompletableFuture
之外,还有任何显着的差异。或何时使用什么?
如果我使用默认CompletableFuture
的{{1}} API(没有执行者的方法),会有什么不同?
答案 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更像是一个承诺。