为什么我的收集器方法不能并行处理数据?
但是,假设此缩减中使用的结果容器是可同时修改的集合 – 例如ConcurrentHashMap。 在这种情况下,累加器的并行调用实际上可以将它们的结果同时存入同一个共享结果容器中,从而消除了组合器合并不同结果容器的需要。 这可能会提升并行执行性能。 我们称之为同时减少。
也
支持并发缩减的收集器标有Collector.Characteristics.CONCURRENT特性。 但是,并发收集也有缺点。 如果多个线程同时将结果存入共享容器,则存储结果的顺序是不确定的。
来自该文件
这意味着与供应商(Concurrent-thread-safe)的collect方法应该有Collector.Characteristics.CONCURRENT 。 因此不应该维持任何秩序。
但是我的代码
List 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不是CONCURRENT ? 如何检查和设置这个特性?
您的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))