[英]ForkJoinTask vs CompletableFuture
在Java 8中,有两种启动异步计算的方法 - CompletableFuture
和ForkJoinTask
。 它们看起来非常相似 - CompletableFuture
的内部类甚至扩展了ForkJoinTask
。
是否有理由使用其中一个?
我可以看到的一个关键区别是CompletableFuture.join
方法只是阻塞,直到将来完成( waitingGet
只是使用ManagedBlocker
旋转),而ForkJoinTask.join
可以从队列中窃取工作来帮助您加入的任务去完成。
有没有超过一个或另一个的好处?
这是两个不同的东西, ForkJoinTask
是可以被提交给一个任务ForkJoinPool
, CompletableFuture
是可以与任何工作承诺Executor
与执行并不需要是ForkJoinPool
,
但是,如果你没有指定任何常见的ForkJoinPool
,那么它是默认的,例如:
CompletableFuture.supplyAsync(()-> supplier);
如果你没有通过Executor
则使用ForkJoinPool
。 还有另一个overload
需要Executor
。
CompletableFuture.supplyAsync(()-> supplier,executor);
Async
,它是CompletableFuture
的static
类,扩展了ForkJoinTask<Void>
,但它不需要是来自Async
文档的ForkJoinTask
/ **基类可以充当FJ或普通Runnable * /
abstract static class Async extends ForkJoinTask<Void>
implements Runnable, AsynchronousCompletionTask
它也可以是Runnable
和AsynchronousCompletionTask
旁注: ForkJoinTask
, ForkJoinPool
, ForkJoin...
类在1.7而不是1.8中添加
我会说当你有一个大任务并希望将它拆分为在几个子任务中并行运行时,更推荐使用ForkJoinTask
。 ForkJoin
框架使用工作窃取算法,可以有效地使用线程。 另一方面, CompletableFutures
更适合于Reactive编程模型,您可以在其中以同步或异步方式创建执行流水线,并通过使用Executor Service的线程池更好地控制线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.