Parallelism в Java 8

Я попытался использовать новую параллельную функцию JDK8, но, к сожалению, я не мог заставить ее работать. NetBeans 7.1 говорит, что метод "parallel" не существует.

Этот метод требует специального импорта? Кто-нибудь имеет пример кода, демонстрирующий Java 8 parallelism?

Ответы

Ответ 1

Я играю с JDK8 Lambda Developer Preview в течение нескольких недель. Ниже я делаю, чтобы упростить компиляцию и тестирование моего кода:

Настройка JEdit для компиляции кода JDK 8

В следующем руководстве описано, как настроить Apache Ant и JEdit, чтобы легко скомпилировать исходный код с помощью JDK 8 Lambda Expressions и новые функции API в JDK 8 Lambda Developer Preview.

Это то, что я делаю на сегодняшний день, в основном потому, что никакая среда IDE не поддерживает эти функции JDK 8.

Загрузите следующее:

Затем создайте следующую структуру каталогов:

Sanbox
|-----jdk8
|-----ant
|-----projects
  • Поместите несжатую JDK-сборку в каталог jdk8.
  • Поместите несжатый Apache Ant в каталог Ant.
  • Каталог проектов будет для проектов JEdit.

Затем установите следующие плагины JEdit:

  • Ant Ферма
  • Java Fold
  • Project Builder
  • Просмотр проектов
  • Мастер проектов
  • SVN Plugin (я использую это, чтобы синхронизировать мои проекты с моим репо, возможно, вам это не понадобится)

Теперь настройте свой Apache Ant:

  • Создайте файл в домашней папке с именем antrc_pre.bat(т.е.% USERPROFILE%\antrc_pre.bat).
  • (Примечание: если вы используете Linux, вы можете настроить это в ~/.ant/ ant.conf).
  • Этот файл будет запущен Apache Ant перед запуском любых задач, поэтому это место для настройки или переопределения того JDK, который вы хотите использовать, определяя переменную JAVA_HOME.
  • В верхней части этого файла укажите переменную JAVA_HOME и укажите ее в каталог, где установлен JDK8. В некотором роде: SET JAVA_HOME=C:\Sanbox\jdk8
  • Обязательно прокомментируйте это, как только закончите сеанс JDK 8, чтобы Ant продолжал использовать конфигурацию по умолчанию.

Время настройки JEdit Ant Плагин

  • В JEdit перейти к плагинам → Параметры плагина → Ant Ферма → Параметры сборки
  • В диалоговом окне выберите опцию: "Запустите Ant цели с помощью внешнего файла script/build"
  • Выберите ant.bat script (т.е. C:\Sandbox\ant\bin\ant.bat).
  • Примечание. Если вы используете Ant 1.8.x, вероятно, вам нужно добавить свойство в раздел свойств плагина: build.compiler = javac1.7, иначе вы получите ошибку при компиляция с JDK 8. Однако у меня не было этой проблемы с Ant 1.7.

Затем создайте новый Java-проект:

  • В JEdit перейдите к плагинам → Project Builder → Создать новый проект
  • Выберите приложение Java и нажмите "Далее"
  • Выберите каталог проектов в качестве места для поиска файлов (т.е. C:\Sanbox\projects).

Voila! На этом этапе JEdit представит четыре кнопки на панели инструментов: сборка приложений, компиляция, очистка и запуск приложения. Они основаны на файле build.xml и выполняются в соответствии с соответствующими задачами Ant. Вы можете пойти, вы можете начать писать лямбда-выражения и использовать новые API: -)

Parallelism Пример

В последнем предварительном просмотре разработчика (b50) еще не реализована небольшая параллелизма. Я вижу, что они делают больше работы в отдельной ветке (если вы хотите загрузить и построить источник OpenJDK8, хотя).

Однако вы можете использовать метод Arrays.parallell, который создает обертку ParallelIterable по массиву. Это можно использовать для проверки некоторых функций parallelism.

Я сделал пример, чтобы найти простые числа в большом массиве. Я мог проверить, что все мои четыре ядра используются, когда я запускаю это параллельно.

Integer[] source = new Integer[30000000];
for(int i=0; i<source.length; i++)
    source[i] = i;

ParallelIterable<Integer> allIntegers = Arrays.parallel(source).filter(isPrime);
Iterable<Integer> primes = allIntegers.into(new LinkedList<Integer>());

Этот компилируется и работает отлично в моем проекте JEdit с Apache Ant 8.4.x и JDk8-b50.

Надеюсь, это поможет.

PD:

Я не определял предикат isPrime в приведенном выше коде, чтобы не затушевывать простоту примера. Я уверен, что eveyone может легко определить предикат примитива, чтобы попробовать этот код.

Ответ 2

Мое предложение было бы поместить Netbeans в одну сторону, использовать текстовый редактор для редактирования вашего Java-кода, а также скомпилировать его и запустить из командной строки с использованием инструментальной цепочки Java 8. Таким образом, вы можете быть уверены, что ваши проблемы не связаны с проблемой Netbeans.

Ответ 3

Проверьте, использует ли ваш netbeans jdk8 (я сомневаюсь). Если это не так, укажите его локальную копию jdk8 вместо встроенного jdk. Надеюсь это поможет.

Ответ 4

Вы можете использовать ночную версию Netbeans, которая теперь имеет некоторую экспериментальную поддержку функций JDK8 - я дал эту попытку, и кажется хорошо работать с лямбдами (по крайней мере, вы не получаете красных сквигглей под ними, автоматическое форматирование и предлагаемые исправления, похоже, пока не работают должным образом, но они в большей степени мешают мелочам.) Вы будете необходимо убедиться, что вы добавили JDK8 с поддержкой Lambda в качестве платформы Java, а затем установите исходный уровень на Java 8 для проекта, с которым вы хотите экспериментировать.

Вы можете захватить последнюю конструкцию JDK, созданную Lambda здесь.

Во время написания в статическом классе Arrays существует три типа параллельных методов, которые можно экспериментировать с - parallelStream(), parallelPrefix() и parallelSort(). Обратите внимание, однако, что это, скорее всего, изменится до окончательной версии, API в настоящее время очень востребован.

Ответ 5

Ниже приведен пример всех каталогов в каталоге моих документов:

List<File> directories = Arrays.asList(new File("/Users/sid/Documents")
                               .listFiles())
                               .parallelStream()
                               .filter(t -> t.isDirectory() == true)
                               .collect(Collectors.toList());

Java 8 обеспечивает поддержку потоков, когда коллекция преобразуется в непрерывный поток объектов. Если размер коллекции мал .stream(), все в порядке. Но если у вас есть большие коллекции и вы хотите использовать функцию parallelism, вы можете использовать метод .parallelStream().