然而,假设此归约中使用的结果容器是一个并发可修改的集合——例如 ConcurrentHashMap。在这种情况下,累加器的并行调用实际上可以将它们的结果同时存入同一个共享结果容器中,从而消除了组合器合并不同结果容器的需要。这可能会提高并行执行性能。我们称之为并发减少。
also
支持并发缩减的收集器标有 Collector.Characteristics.CONCURRENT 特征。然而,并发收集也有一个缺点。如果多个线程同时将结果存入共享容器,则结果存入的顺序是不确定的。
来自document
这意味着带有供应商的收集方法(并发线程安全)应该具有收集器.特性.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 不并发?如何检查和设置这个特性?
Your 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))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)