当前位置: 首页 > 知识库问答 >
问题:

ForkJoinTask与CompletableFuture

岑和风
2023-03-14

在Java8中,有两种启动异步计算的方法-completablefutureforkjointask。这两者看起来相当相似-completablefuture内部类甚至扩展了forkjointask

有理由用一个代替另一个吗?

我看到的一个关键区别是,completablefuture.join方法只是阻塞,直到将来完成(waitingget只是使用managedblocker旋转),而forkjointask.join可以从队列中窃取工作,以帮助您加入的任务完成。

有没有比这一个或那一个更好的好处?

共有1个答案

公孙嘉禧
2023-03-14

这是两回事,forkjoinask是一个可以提交给forkjoinpool的任务,completablefuture是一个可以与任何执行器一起工作的promise,执行器不需要是forkjoinpool,

但是,如果您没有指定任何命令,那么通用的forkjoinpool是默认的,例如:

CompletableFuture.supplyAsync(()-> supplier);

如果不传递执行器,则使用forkjoinpool。还有另一个重载采用执行器

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

Async,它是CompletableFuture扩展ForkJointAsk 中的一个Static类,但它不需要是ForkJointAsk,来自Async的文档

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

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

它还可以是RunnableAsynchronousCompletionTask

只是附带说明:forkjoinaskforkjoinpoolforkjoin...类是在1.7中添加的,而不是在1.8中添加的

 类似资料:
  • 假设我们扩展了一个名为<code>MyRecursiveTask。 然后在 forkJoinTask 的范围内创建两个子任务: 我认为“t2”将位于工作队列的顶部(这是一个deque,它被用作worker本身的堆栈),因为我看到fork方法的实现如下: 如果是,以下两个表达式的性能是否存在差异: 表达式1: 表达式 2: 我认为这可能很重要在<code>t2.join()完成之前将始终处于阻塞状态

  • 所以如果有谁能解释或指向我这样的博客或文章,那对我真的是好事。

  • 在C语言中,假设每个算法被赋予完全相同的一组进程,那么先到先得、最短作业优先和循环之间的周转时间是否相等?还是调度算法不同?

  • 问题内容: 与使用CompletableFuture相比,直接将代码传递给线程有什么好处? VS 问题答案: 在受 管理 的forkJoin-Pool中运行Runnable ,同时创建一个 必须管理 的新线程。 “受管理” 是什么意思,它是预先分配的,线程在JVM中共享。当可运行对象完成时,该线程可重用于其他可运行对象。这样可以更好地利用资源,尤其是因为线程实例化是一项昂贵的操作- 不仅必须分配对

  • 问题内容: 我无法理解)和之间的区别。 那么,有人可以提供有效的用例吗? 从Java文档中: 返回一个新值,当此阶段正常完成时,将使用该阶段的结果作为所提供函数的参数来执行该操作。 返回一个新值,当此阶段正常完成时,将以该阶段作为所提供函数的参数来执行此操作。 我得到扩展的CompletionStage 的第二个参数,而没有扩展。 有人可以提供一个例子,说明我必须在什么情况下使用以及何时使用? 问

  • 问题内容: 为了为 HTML5 Doctype 定义字符集,我应该使用哪种表示法? 短: 长: 问题答案: 在HTML5中,它们是等效的。使用较短的一个,更容易记住和键入。浏览器支持很好,因为它是为向后兼容而设计的。