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

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?如何检查和设置这个特性?

Eug*_*ene 5

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)

  • @amarnathharish 你会遇到麻烦......你实际上会说`ArrayList` 更适合从多个线程更新,事情会崩溃。他们会怎么破?好吧,您可能会在结果列表中获得异常、空条目或并非所有条目 (2认同)

归档时间:

查看次数:

84 次

最近记录:

7 年,9 月 前