要并行或异步运行某些内容,我可以使用ExecutorService:<T> Future<T> submit(Runnable task, T result);或CompletableFuture Api :(static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor); 假设在两种情况下我都使用相同的Executor)
<T> Future<T> submit(Runnable task, T result);
static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor);
除了返回类型Futurevs. 之外,CompletableFuture还存在其他显着差异。或什么时候使用什么?
Future
CompletableFuture
如果我将CompletableFutureAPI与默认值一起使用Executor(没有执行程序的方法)有什么区别?
Executor
除了返回类型Future与CompletableFuture之外,还存在其他显着差异。或什么时候使用什么?
真的很简单。您可以使用Future,当你想执行的线程等待异步计算响应。并行合并/排序就是一个例子。异步左排序,同步右排序,等待左完成(future.get()),合并结果。
future.get()
CompleteableFuture当您要执行某些操作时使用a ,完成后的结果与执行的线程异步。例如:我想异步进行一些计算,然后在计算时将结果写入某个系统。然后,发出请求的线程可能不需要等待结果。
CompleteableFuture
您可以在单个Future可执行文件中模仿以上示例,但是该CompletableFuture接口提供了更流畅的界面和更好的错误处理。
这实际上取决于您要做什么。
如果我将CompletableFutureApi与默认的执行程序(没有执行程序的方法)一起使用,会有什么区别?
它将ForkJoin.commonPool()默认的大小委托给您系统上的CPU数量。如果您要执行大量的IO操作(读取和写入文件系统),则应该以不同的方式定义线程池。
ForkJoin.commonPool()
如果占用大量CPU,则使用commonPool最有意义。