ForkJoinTask与CompletableFuture

时间:2015-11-26 17:43:28

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

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

是否有理由使用其中一个?

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

是否有益于其中一种?

2 个答案:

答案 0 :(得分:4)

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

但是,如果您没有指定任何内容,那么普通ForkJoinPool是默认值,例如:

CompletableFuture.supplyAsync(()-> supplier);
如果您没有通过ForkJoinPool,则

使用Executor。还有另一个overload需要Executor

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

Asyncstatic中的CompletableFuture类扩展了ForkJoinTask<Void>,但它并不需要是ForkJoinTask,来自Async

的文档
  

/ **基类可以作为FJ或普通的Runnable * /

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

它还可以是RunnableAsynchronousCompletionTask

旁边注意:ForkJoinTaskForkJoinPoolForkJoin...类已添加到1.7而不是1.8

答案 1 :(得分:2)

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