在Java8中,有两种启动异步计算的方法-completablefuture
和forkjointask
。这两者看起来相当相似-completablefuture
的内部类甚至扩展了forkjointask
。
有理由用一个代替另一个吗?
我看到的一个关键区别是,completablefuture.join
方法只是阻塞,直到将来完成(waitingget
只是使用managedblocker
旋转),而forkjointask.join
可以从队列中窃取工作,以帮助您加入的任务完成。
有没有比这一个或那一个更好的好处?
这是两回事,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
它还可以是Runnable
和AsynchronousCompletionTask
只是附带说明:forkjoinask
、forkjoinpool
和forkjoin...
类是在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中,它们是等效的。使用较短的一个,更容易记住和键入。浏览器支持很好,因为它是为向后兼容而设计的。