【发布时间】:2009-07-03 02:46:42
【问题描述】:
我有一些在 .Net 开发中使用并行扩展的经验,但我正在考虑在 Java 中做一些工作,这将受益于一个易于使用的并行库。 JVM 是否提供与并行扩展类似的工具?
【问题讨论】:
标签: java .net parallel-extensions
我有一些在 .Net 开发中使用并行扩展的经验,但我正在考虑在 Java 中做一些工作,这将受益于一个易于使用的并行库。 JVM 是否提供与并行扩展类似的工具?
【问题讨论】:
标签: java .net parallel-extensions
您应该熟悉java.util.concurrent 包。它具有简单而健壮的并行编程原语,可以作为高级库的基础。这种库的一个例子是Functional Java,它有an easy-to-use module for parallel programming。
例如,这里是使用函数式 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;
【讨论】:
自 java 5 以来,java.util.concurrent 包中的支持有限,但完全支持 java 7 feature。
【讨论】:
您应该绝对尝试 Ateji Parralel 扩展。 http://www.ateji.com/multicore/
【讨论】:
这里是 JSR166 工作组的站点,他们为 Java 7 编写了新的并发类。
http://g.oswego.edu/dl/concurrency-interest/
列出了 2 个包:jsr166y(Java 7 的新并发类)和 extra166y(由于某种原因将不包括在内的各种类)。
extra166y 中的一个类,ParallelArray 非常有用。它会自动并行化二分搜索、合并排序等。
【讨论】: