ama*_*ish 3 java java-8 java-stream
然而,假设此归约中使用的结果容器是一个可并发修改的集合——例如 ConcurrentHashMap。在这种情况下,累加器的并行调用实际上可以同时将它们的结果存入同一个共享结果容器中,从而无需组合器合并不同的结果容器。这可能会提高并行执行性能。我们称之为并发减少。
还
支持并发减少的收集器标记有 Collector.Characteristics.CONCURRENT 特性。但是,并发收集也有缺点。如果多个线程同时将结果存放到共享容器中,则存放结果的顺序是不确定的。
从文件
这意味着带有供应商(并发线程安全)的 collect 方法应该有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());
Run Code Online (Sandbox Code Playgroud)
总是按照遇到的顺序打印结果。这是否意味着我的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))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |