Параллельный поток Java создает HashMap - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть следующий тест, проверить целые числа в диапазоне от 0 до max и, если он проверен, построить пару (vals [i], i). Наконец, я хочу создать HashMap, который использует vals [i] в ​​качестве ключа, а значение представляет собой список целых чисел. Код выглядит так:

IntStream.range(0, max)
   .parallel()
   .filter(i-> sometest(i))
   .mapToObj(i -> new Pair<>(vals[i],i))
   .collect(groupingBy(Pair::getFirst, mapping(Pair::getSecond, toList())));

Мой вопрос: возможно ли использовать параллельные потоки для ускорения построения этой карты?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Если вы просто хотите узнать, как лучше использовать преимущества параллелизма, вы можете сделать что-то вроде:

ConcurrentMap<Integer, List<Integer>> map = IntStream.range(0, Integer.MAX_VALUE)
    .parallel()
    .filter(i -> i % 2 == 0)
    .boxed()
    .collect(Collectors.groupingByConcurrent(
        i -> i / 3,
        Collectors.mapping(i -> i, Collectors.toList())));

Промежуточное создание пар не требуется, и groupingByConcurrent параллельно накапливается в новой ConcurrentMap.

Имейте в виду, что с параллельным потоком вы застряли с общим ForkJoinPool. Для распараллеливания предпочтительнее использовать что-то более гибкое, например ExecutorService вместо Java Streams.

0 голосов
/ 12 сентября 2018

Это условия, которые вы должны выполнить, чтобы выполнить параллельное сокращение, как указано в Документации Java по параллелизму :

Среда выполнения Java выполняет параллельное сокращениеесли все перечисленное ниже верно для конкретного конвейера, который содержит операцию сбора:

  • Поток параллелен.
  • Параметр операции сбора, сборщик, имеетХарактеристика Коллектор. ХАРАКТЕРИСТИКИ.Чтобы определить характеристики коллектора, вызовите метод Collector.characteristics.
  • Либо поток неупорядочен, либо у коллектора есть характеристика Collector.Characteristics.UNORDERED.Чтобы гарантировать, что поток неупорядочен, вызовите операцию BaseStream.unordered.

Но ускорит ли это построение вашей Карты, будет зависеть от других аспектов, как упомянуто @JigarДжоши, включая (но не только):

  • Сколько элементов вы должны обработать
  • Сколько потоков уже используется вашим приложением

Иногда накладные расходы на использование параллелизма (создание и остановка потоков, их взаимодействие и синхронизация, ...) превышают выгоды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...