ForkJoinTask vs CompletableFuture

在 Java 8 中,有两种启动异步计算的方法 - 和 .它们似乎都非常相似 - 甚至扩展的内部类。CompletableFutureForkJoinTaskCompletableFutureForkJoinTask

是否有理由使用一个而不是另一个?

我可以看到的一个关键区别是,该方法只是阻止直到未来完成(只是使用a旋转),而a可以从队列中窃取工作,以帮助你加入的任务完成。CompletableFuture.joinwaitingGetManagedBlockerForkJoinTask.join

有没有比一个或另一个好处?


答案 1

它们是两个不同的东西,是一个可以提交给的任务,是一个可以与任何一起工作的承诺,执行者不需要是,ForkJoinTaskForkJoinPoolCompletableFutureExecutorForkJoinPool

但是,如果您不指定任何内容,则 common 是默认值,例如:ForkJoinPool

CompletableFuture.supplyAsync(()-> supplier);

使用 if 如果您没有传递 .还有另一个需要.ForkJoinPoolExecutoroverloadExecutor

CompletableFuture.supplyAsync(()-> supplier,executor);

Async,这是 extends 中的一个类,但它不需要是 一个 ,来自staticCompletableFutureForkJoinTask<Void>ForkJoinTaskAsync

基类可以充当 FJ 或普通可运行 */

abstract static class Async extends ForkJoinTask<Void>
    implements Runnable, AsynchronousCompletionTask 

它也可以 a 和 aRunnableAsynchronousCompletionTask

只是旁注:,,类是在1.7而不是1.8中添加的ForkJoinTaskForkJoinPoolForkJoin...


答案 2

我想说的是,当你有一个大任务并希望将其拆分为在几个子任务中并行运行时,更推荐。该框架使用工作窃取算法,该算法将有效利用线程。另一方面,它们更适合于反应式编程模型,在该模型中,您可以以同步或异步方式创建执行管道,并使用 Executor 服务的线程池更好地控制线程。ForkJoinTaskForkJoinCompletableFutures