3

我有一些在 .Net 开发中使用并行扩展的经验,但我正在考虑用 Java 做一些工作,这将受益于一个易于使用的并行库。JVM 是否提供与并行扩展类似的工具?

4

4 回答 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 回答