Почему мой метод сбора не обрабатывает данные параллельно? - PullRequest
0 голосов
/ 28 августа 2018

Предположим, однако, что контейнер результатов, использованный в этом сокращении, был одновременно изменяемой коллекцией, такой как ConcurrentHashMap. В этом случае параллельные вызовы аккумулятора могут фактически одновременно помещать свои результаты в один и тот же общий контейнер результатов, что устраняет необходимость объединения объединителями различных контейнеров результатов. Это потенциально обеспечивает повышение производительности параллельного выполнения. Мы называем это одновременным сокращением.

также

Коллектор, поддерживающий одновременное сокращение, помечается характеристикой Collector.Characteristics.CONCURRENT. Тем не менее, параллельная коллекция также имеет обратную сторону. Если несколько потоков помещают результаты одновременно в общий контейнер, порядок их размещения является недетерминированным.

из документа

это означает, что метод сбора с поставщиком (Concurrent-thread-safe) должен иметь Collector.Characteristics.CONCURRENT . и, следовательно, не должны поддерживать порядок.

но мой код

List<Employee> li=Arrays.asList(Employee.emparr());
        System.out.println("printing concurrent result "+li.stream().parallel().unordered().map(s->s.getName()).collect(() -> new ConcurrentLinkedQueue<>(),
                (c, e) -> c.add(e.toString()),
                (c1, c2) -> c1.addAll(c2))
                                                  .toString());

всегда печатает результат в найденном порядке. Означает ли это, что мой Collector. Характеристики не совпадают ? как проверить и установить эти характеристики?

1 Ответ

0 голосов
/ 28 августа 2018

Ваш Collector не знает, что вы используете параллельную коллекцию, предоставленную Supplier, просто добавьте характеристику и убедитесь, что она выполняется так, как вы хотите; например:

String s = Stream.of(1, 2, 3, 4).parallel()
            .unordered()
            .collect(
                    Collector.of(
                            () -> new ConcurrentLinkedQueue<>(),
                            (c, e) -> c.add(e.toString()),
                            (c1, c2) -> {
                                c1.addAll(c2);
                                return c1;
                            },
                            Characteristics.CONCURRENT))
...