14

在 Java 8 中有两种启动异步计算的方法 -CompletableFutureForkJoinTask. 它们看起来都非常相似 - CompletableFutureeven extend的内部类ForkJoinTask

有理由使用其中一个吗?

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

是否比其中一个有好处?

4

2 回答 2

9

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

但是,ForkJoinPool如果您未指定任何内容,则 common 是默认设置,例如:

CompletableFuture.supplyAsync(()-> supplier);

ForkJoinPool如果你没有通过Executor. 还有一个overload需要Executor.

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

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

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

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

它也可以一个Runnable和一个AsynchronousCompletionTask

顺便说一句:ForkJoinTask, ForkJoinPool,ForkJoin...类是在 1.7 而不是 1.8 中添加的

于 2015-11-26T17:56:11.620 回答
5

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

于 2016-09-28T20:52:42.650 回答