我们可以在Java中同时使用fork/join和executor服务吗?

我们可以在Java中同时使用fork/join和executor服务吗?,java,concurrency,Java,Concurrency,本质上,我正在编写一个算法,该算法涉及将所有数字相加到一个大数组中,每个数组都带有一个参数。我有很多参数要运行。对我来说,所有数字的求和可以很好地利用Java中的fork/join,使用不同的参数运行算法可以在固定的executor服务池中有效地完成 然而,有人知道如何将这两者结合起来吗?或者,考虑到它们都是线程池,我们不应该同时拥有两个池,是否可以将它们组合起来 如有任何建议,将不胜感激 您可以有一个池,并将所有任务提交到此池 主要问题是池应该有多少线程(并行性)。您可以从默认值(N=处理器数

本质上,我正在编写一个算法,该算法涉及将所有数字相加到一个大数组中,每个数组都带有一个参数。我有很多参数要运行。对我来说,所有数字的求和可以很好地利用Java中的fork/join,使用不同的参数运行算法可以在固定的executor服务池中有效地完成

然而,有人知道如何将这两者结合起来吗?或者,考虑到它们都是线程池,我们不应该同时拥有两个池,是否可以将它们组合起来


如有任何建议,将不胜感激

您可以有一个池,并将所有任务提交到此池

主要问题是池应该有多少线程(并行性)。您可以从默认值(N=处理器数量)开始,并使用不同的并行性测试吞吐量。我猜峰值吞吐量在N到2N之间

在Java 8中,甚至还有一个:

静态commonPool()可用,适用于大多数应用程序


FJP的优点是性能接近最优,对调优不敏感(只要配置在合理的范围内,比如说,不是10*N个线程)

正如zhong.j.yu所说,池的数量不如这些池中同时活动的线程的数量重要

ForkJoinPool最适合于将自身借给细分/组合方案的任务,正如名称
RecursiveTask
所暗示的那样。它们可能不是汇总数组值的最佳选择,这听起来像是一项缓存/内存有限的任务

您应该进行一些分析,或者至少对线程的数量进行试验,因为缓存抖动会在某个时候限制性能

ForkJoinPool是高度优化的(查看类注释),比ThreadPoolExecutor优化得多,但对于内存有限的作业,您不会注意到差异


根据我的经验,提交到任一池的每个任务至少需要100µs才能达到最佳平衡。许多小作业可能会提供最佳的线程利用率,但处理作业队列中的所有可运行项会增加开销。

谢谢您的帖子。目前使用Java 7时,如果只有一个池,它是newFixedThreadPool(对于执行者,因为我知道需要尝试多少个参数)还是ForkJoinPool(对于fork/join以加速添加)?如何使用一个池来支持这两个池?然而,在我看来,有两个泳池并不合理。顺便说一句,我假设池需要是单例的,对吗?ForkJoinPool是一个ExecutorService,您可以向it1提交普通任务。如何利用有关参数数量(因此线程数量)的知识?2.与加法不同,很难将这些并行任务(仅参数不同)编写为递归任务。如何处理?