Эквивалент параллельных расширений в Java

У меня есть некоторый опыт использования параллельных расширений в разработке.Net, но я искал работу на Java, которая выиграла бы от простой в использовании библиотеки параллелизма. Предлагает ли JVM какие-либо сопоставимые инструменты для параллельных расширений?

4 ответа

Решение

Начиная с java 5, в пакете java.util.concurrent есть ограниченная поддержка, но полная поддержка - это функция java 7.

Вам следует ознакомиться с пакетом java.util.concurrent. Он имеет простые и надежные примитивы для параллельного программирования, на которых основаны библиотеки более высокого уровня. Одним из примеров такой библиотеки является функциональная Java, которая имеет простой в использовании модуль для параллельного программирования.

Например, вот канонический пример MapReduce, написанный с использованием функциональной Java. Он подсчитывает количество слов в наборе документов, предполагая, что документы являются потоками символов:

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;

Вы должны определенно попробовать расширения Ateji Parralel. http://www.ateji.com/multicore/

Вот сайт для рабочей группы JSR166, которая написала новые классы параллелизма для Java 7.

http://g.oswego.edu/dl/concurrency-interest/

В списке есть 2 пакета: jsr166y (новые классы параллелизма для Java 7) и extra166y (различные классы, которые по тем или иным причинам не будут включены).

Один из классов в экстра166й, ParallelArray это очень полезно. Он автоматически распараллеливает бинарный поиск, сортировку слиянием и т. Д.

Другие вопросы по тегам