ForkJoinTask与CompletableFuture

the*_*oop 9 java future fork-join forkjoinpool completable-future

在Java 8中,有两种方法可以启动异步计算 - CompletableFutureForkJoinTask.它们看起来都非常相似 - 内部类CompletableFuture甚至延伸ForkJoinTask.

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

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

有没有超过一个或另一个的好处?

Sle*_*idi 5

他们是两回事,ForkJoinTask是可以提交给的任务ForkJoinPoolCompletableFuture是可以与任何人一起工作的承诺,Executor执行者不必是ForkJoinPool

的确,ForkJoinPool如果您未指定任何公用名称,则默认为公用名称,例如:

CompletableFuture.supplyAsync(()-> supplier);
Run Code Online (Sandbox Code Playgroud)

使用了ForkJoinPool,如果你不及格的Executor。还有另一个overload需要一个Executor

CompletableFuture.supplyAsync(()-> supplier,executor);
Run Code Online (Sandbox Code Playgroud)

Async,它是extends中的一个static类,但从的文档中不必是,CompletableFutureForkJoinTask<Void>ForkJoinTaskAsync

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

abstract static class Async extends ForkJoinTask<Void>
    implements Runnable, AsynchronousCompletionTask 
Run Code Online (Sandbox Code Playgroud)

它也可以RunnableAsynchronousCompletionTask

刚上侧面说明:ForkJoinTaskForkJoinPoolForkJoin...在1.7和1.8不添加类


Ale*_*iro 5

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