在Java 8中,有两种启动异步计算的方法-CompletableFuture
和ForkJoinTask
。它们看起来都非常相似-CompletableFuture
的内部类甚至扩展了ForkJoinTask
。
有理由在一个之上使用另一个吗?
我可以看到的一个关键区别是CompletableFuture.join
方法只是阻塞直到将来完成(waitingGet
只是使用ManagedBlocker
旋转),而ForkJoinTask.join
可以将工作从队列中窃取,以帮助您加入的任务完成。
相对于另一个有好处吗?
最佳答案
他们是两回事,ForkJoinTask
是可以提交给ForkJoinPool
的任务,CompletableFuture
是可以与任何Executor
一起使用的 promise ,执行者不必是ForkJoinPool
,
但是,如果没有指定任何公共(public)ForkJoinPool
,则默认为ForkJoinPool
,例如:
CompletableFuture.supplyAsync(()-> supplier);
如果不传递
Executor
,则使用overload
。还有另一个采用Executor
的Async
。CompletableFuture.supplyAsync(()-> supplier,executor);
static
是CompletableFuture
中的ForkJoinTask<Void>
类,它扩展了ForkJoinTask
,但从Async
的文档开始,它不必是Runnable
。abstract static class Async extends ForkJoinTask<Void>
implements Runnable, AsynchronousCompletionTask
它也可以是
AsynchronousCompletionTask
和ForkJoinTask
顺便提一下:
ForkJoinPool
,ForkJoin...
和ojit_code类是在1.7中添加的,而不是在1.8中添加的