Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ForkJoinTask与CompletableFuture_Java_Future_Fork Join_Forkjoinpool_Completable Future - Fatal编程技术网

Java ForkJoinTask与CompletableFuture

Java ForkJoinTask与CompletableFuture,java,future,fork-join,forkjoinpool,completable-future,Java,Future,Fork Join,Forkjoinpool,Completable Future,在Java8中,有两种启动异步计算的方法-CompletableFuture和ForkJoinTask。它们看起来相当相似,CompletableFuture的内部类甚至扩展了ForkJoinTask 是否有理由使用一个而不是另一个 我可以看到的一个关键区别是,CompletableFuture.join方法只是阻塞直到未来完成(waitingGet只是使用ManagedBlocker旋转),而forkjointtask.join可以从队列中窃取工作,以帮助您加入的任务完成 它们是两件不同的事情

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

是否有理由使用一个而不是另一个

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


它们是两件不同的事情,
ForkJoinTask
是一项可以提交给
ForkJoinPool
的任务,
CompletableFuture
是一项可以与任何
执行者一起工作的承诺,执行者不需要是
ForkJoinPool

但是,如果未指定任何值,则公共
ForkJoinPool
是默认值,例如:

CompletableFuture.supplyAsync(()-> supplier);
如果未传递执行器,则使用
ForkJoinPool
。还有另一个
重载
,它使用
执行器

CompletableFuture.supplyAsync(()-> supplier,executor);
Async
,它是
CompletableFuture
中的
静态
类,扩展了
ForkJoinTask
,但它不需要是
Async
文档中的
ForkJoinTask

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

抽象静态类异步扩展ForkJoinTask
实现可运行的异步CompletionTask
它还可以是
可运行的
异步完成任务


附带说明:
ForkJoinTask
ForkJoinPool
ForkJoin…
类是在1.7中添加的,而不是在1.8中添加的
ForkJoinTask

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

我想我的问题更多的是关于何时使用一个而不是另一个(假设您使用的是默认的通用FJP)。当加入到一个完整的未来时,它是否有助于完成您加入的任务?@thecoop我不知道如何用一个替换另一个,完整的未来是一个承诺,它的操作类似于应用和撰写,现在如果您的问题是我何时使用ForkJoinTask?我会说,当你写你自己的并行算法
abstract static class Async extends ForkJoinTask<Void>
    implements Runnable, AsynchronousCompletionTask