繁体   English   中英

ForkJoinTask与CompletableFuture

[英]ForkJoinTask vs CompletableFuture

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

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

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

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

这是两个不同的东西, ForkJoinTask是可以被提交给一个任务ForkJoinPoolCompletableFuture是可以与任何工作承诺Executor与执行并不需要是ForkJoinPool

但是,如果你没有指定任何常见的ForkJoinPool ,那么它是默认的,例如:

CompletableFuture.supplyAsync(()-> supplier);

如果你没有通过Executor则使用ForkJoinPool 还有另一个overload需要Executor

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

Async ,它是CompletableFuturestatic类,扩展了ForkJoinTask<Void> ,但它不需要是来自Async文档的ForkJoinTask

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

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

它也可以是RunnableAsynchronousCompletionTask

旁注: ForkJoinTaskForkJoinPoolForkJoin...类在1.7而不是1.8中添加

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM