Эквивалент параллельных расширений в 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
это очень полезно. Он автоматически распараллеливает бинарный поиск, сортировку слиянием и т. Д.