2013-03-12 43 views
2

从本质上讲,我正在编码一个算法,其中包括汇总大数组中的所有数字,每个数字都带一个参数。我有一堆参数可以运行。对我来说,所有数字的总和可以很好地利用Java中的fork/join,并且使用固定的执行器服务池可以有效地运行不同参数的算法。我们可以在Java中同时使用fork/join和executor服务吗?

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

任何建议将非常感激。

回答

0

你可以有一个游泳池,并提交所有的任务给这个池。

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

在Java 8,甚至还有一个common pool

静态commonPool()是可用且适于大多数应用。

约FJP的好处就是性能接近最优和不敏感的调整(只要配置是在合理的范围内,也就是说,不是10个* N个线程)

+0

感谢您的帖子。目前使用Java 7,如果只有一个池,它会是newFixedThreadPool(对于执行者,因为我知道需要尝试多少个参数)或者ForkJoinPool(用于fork/join来加速添加)?我怎样才能使用一个池来支持两者?但是,两个池对我来说听起来不合理。顺便说一句,我假设游泳池必须是单身人士吗? – user2159018 2013-03-12 16:55:00

+0

ForkJoinPool是一个ExecutorService,您可以向其提交普通任务 – ZhongYu 2013-03-12 17:14:58

+0

1.如何利用参数数量(因此线程数量)的知识? 2.与递归不同,很难将这些并行任务(仅在参数上不同)编写为递归任务。如何处理? – user2159018 2013-03-12 20:03:07

0

由于zhong.j。 Yu表示,池的数量不如在这些池中同时活动的线程数量的总和。

一个ForkJoinPool是最适合的借给自己的细分/组合方案,由名RecursiveTask作为暗示的任务。它们可能不是总结数组值的最佳选择,这听起来像是缓存/内存限制类型的任务。

你应该做一些分析或线程的数量至少试验,如高速缓存抖动会在某些时候限制性能。

ForkJoinPool是高度优化(检查类评论),比的ThreadPoolExecutor更加如此,但对于内存有限的就业机会,你不会注意到其中的差别。

以我的经验,提出要么池应采取最佳平衡至少100μs的每一个任务。许多小作业可能会提供最佳的线程利用率,但处理作业队列中的所有Runnables会产生开销。

相关问题