我有一些在 .Net 开发中使用并行扩展的经验,但我正在考虑用 Java 做一些工作,这将受益于一个易于使用的并行库。JVM 是否提供与并行扩展类似的工具?
问问题
762 次
4 回答
3
您应该熟悉java.util.concurrent包。它具有用于并行编程的简单而强大的原语,可以作为高级库的基础。此类库的一个示例是Functional Java,它具有用于并行编程的易于使用的模块。
例如,这里是使用函数式 Java 编写的规范 MapReduce 示例。它计算一组文档中的单词数,假设文档是字符流:
public static long countWords(final List<Stream<Character>> documents,
final ParModule m)
{ return m.parFoldMap(documents,
new F<Stream<Character>, Long>()
{ public Long f(final Stream<Character> document)
{ return (long)fromStream(document).words().length(); }},
longAdditionMonoid)
.claim(); }
为了实例化 ParModule,你给它一个并行策略。您可以实施自己的策略,或使用提供的策略。这是一个使用 16 个线程的固定池:
ExecutorService pool = newFixedThreadPool(16);
ParModule m = parModule(executorStrategy(pool));
对于上面的示例,您需要以下导入:
import fj.F;
import fj.data.Stream;
import fj.control.parallel.ParModule;
import static fj.control.parallel.ParModule.parModule;
import static fj.pre.Monoid.longAdditionMonoid;
import static fj.data.LazyString.fromStream;
import static fj.control.parallel.Strategy.executorStrategy;
import static java.util.concurrent.Executors.newFixedThreadPool;
import java.util.concurrent.ExecutorService;
于 2009-07-03T04:22:14.700 回答
2
自 java 5 以来, java.util.concurrent包中的支持有限,但完全支持java 7 特性。
于 2009-07-03T02:56:12.110 回答
2
您应该绝对尝试 Ateji Parralel 扩展。 http://www.ateji.com/multicore/
于 2010-06-09T04:30:26.993 回答
1
这是 JSR166 工作组的站点,他们为 Java 7 编写了新的并发类。
http://g.oswego.edu/dl/concurrency-interest/
列出了 2 个包:jsr166y(Java 7 的新并发类)和 extra166y(由于某种原因将不包括在内的各种类)。
extra166y 中的一个类,ParallelArray
非常有用。它自动并行化二进制搜索、合并排序等。
于 2009-07-03T04:39:52.503 回答