但是,假设在这个简化中使用的结果容器是一个并发可修改的集合--比如一个ConcurrentHashMap。在这种情况下,累加器的并行调用实际上可以将它们的结果并发地存放到同一个共享结果容器中,从而消除了组合器合并不同结果容器的需要。这可能会提高并行执行性能。我们称这为并行缩减。
也是
支持并发约简的收集器被标记为Collector.Characteristics.CONCURRENT特征。但是,并发集合也有其缺点。如果多个线程同时将结果保存到共享容器中,则结果的存放顺序是不确定的。
来自文档
这意味着与供应商的收集方法(并发线程安全)应该具有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不是并发?如何检查和设置这一特性?
发布于 2018-08-28 09:12:53
您的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))https://stackoverflow.com/questions/52054008
复制相似问题