为什么我的收集器方法不并行处理数据?

时间:2018-08-28 09:04:27

标签: java java-8 java-stream

  

但是,假设此归约过程中使用的结果容器是可同时修改的集合,例如ConcurrentHashMap。在那种情况下,累加器的并行调用实际上可以将它们的结果并发地存储到同一共享结果容器中,从而消除了组合器合并不同结果容器的需求。这可能会提高并行执行性能。我们称其为同时减少。

  

支持并发缩减的收集器标有Collector.Characteristics.CONCURRENT特性。但是,并发收集也有一个缺点。如果有多个线程将结果同时存储到共享容器中,则结果的存储顺序不确定。

来自document

这意味着与供应商(并发线程安全)的收集方法应具有 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.Characteristics不同步?如何检查和设置此特性?

1 个答案:

答案 0 :(得分:4)

您的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))