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

有理由在一个之上使用另一个吗?

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

相对于另一个有好处吗?

最佳答案

他们是两回事,ForkJoinTask是可以提交给ForkJoinPool的任务,CompletableFuture是可以与任何Executor一起使用的 promise ,执行者不必是ForkJoinPool

但是,如果没有指定任何公共(public)ForkJoinPool,则默认为ForkJoinPool,例如:

CompletableFuture.supplyAsync(()-> supplier);

如果不传递Executor,则使用overload。还有另一个采用ExecutorAsync
CompletableFuture.supplyAsync(()-> supplier,executor);
staticCompletableFuture中的ForkJoinTask<Void>类,它扩展了ForkJoinTask,但从Async的文档开始,它不必是Runnable


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

它也可以是AsynchronousCompletionTaskForkJoinTask
顺便提一下:ForkJoinPoolForkJoin...和ojit_code类是在1.7中添加的,而不是在1.8中添加的

10-08 10:55