【问题标题】:ForkJoinTask vs CompletableFutureForkJoinTask 与 CompletableFuture
【发布时间】:2015-11-26 17:43:28
【问题描述】:

在 Java 8 中,有两种启动异步计算的方法 - CompletableFutureForkJoinTask。它们看起来都非常相似——CompletableFuture 的内部类甚至扩展了ForkJoinTask

有理由使用其中一个吗?

我可以看到的一个关键区别是 CompletableFuture.join 方法只是阻塞直到未来完成(waitingGet 只是使用 ManagedBlocker 旋转),而 ForkJoinTask.join 可以从队列中窃取工作以提供帮助您要参与完成的任务。

这两者有什么好处吗?

【问题讨论】:

    标签: java future fork-join forkjoinpool completable-future


    【解决方案1】:

    它们是两个不同的东西,ForkJoinTask 是可以提交给ForkJoinPool 的任务,CompletableFuture 是可以与任何Executor 一起使用的承诺,并且执行者不需要是@ 987654325@,

    如果您不指定任何 ForkJoinPool 是默认值,例如:

    CompletableFuture.supplyAsync(()-> supplier);
    

    如果您没有传递Executor,则使用ForkJoinPool。还有一个overload 接受Executor

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

    Async,这是CompletableFuture 中的static 类扩展ForkJoinTask<Void>,但它不需要是ForkJoinTask,来自Async 的文档

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

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

    也可以是RunnableAsynchronousCompletionTask

    附注:ForkJoinTaskForkJoinPoolForkJoin... 类是在 1.7 而不是 1.8 中添加的

    【讨论】:

    • 我想我的问题更多是关于何时使用一个而不是另一个(假设您使用的是默认的常见 FJP)。加入 CompletableFuture 时,是否有助于完成您加入的任务?
    • @thecoop 我不明白你怎么能用另一个替换一个,CompletableFuture 是一个承诺,它有 thenApply 和 thenCompose 之类的操作,现在如果你的问题是我什么时候使用 ForkJoinTask?我会说当你编写自己的并行算法时
    【解决方案2】:

    我会说ForkJoinTask 在您有一项大任务并希望将其拆分以在多个子任务中并行运行时更推荐。 ForkJoin 框架使用工作窃取算法,这将有效利用线程。另一方面,CompletableFutures 更适合 Reactive 编程模型,您可以在其中以同步或异步方式创建执行管道,并通过使用 Executor Service 的线程池更好地控制线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      • 2016-06-08
      • 2018-01-11
      • 2018-12-11
      • 1970-01-01
      • 2016-03-11
      相关资源
      最近更新 更多