为什么 list.parallelStream().forEach() 在 Java 中不处理列表中的所有元素?

2022-09-04 21:04:44

下面的代码在完成并行过程后不会将所有元素放在目标列表中。这有什么原因吗?

public static void main(String[] args) {

    List<Integer> source =new ArrayList<>();
    List<Integer> destination = new ArrayList<>();
    IntStream.range(0, 10000).forEach(element ->{
        source.add(element);
    });

    //System.out.println(source.size());

    source.parallelStream().forEach(c->{
        destination.add(c);
    });

    System.out.println("Source Size:"+source.size());
    System.out.println("destination size:"+destination.size());
}

输出:源码:10000 目标尺寸:4343


答案 1

因为 不是线程安全的集合。使用类似线程安全的集合可以使其正确但不一定有效。ArrayListCopyOnWriteArrayList

使用 a 会更简单、更正确。例如:Collector

source.parallelStream().collect(Collectors.toList())

答案 2

并行流的操作是从多个线程向未同步 (an ) 添加元素。因此,该操作不是线程安全的,并具有意外的结果。forEachCollectionArrayList

使用 而不是 将确保 的所有元素都添加到 .forEachOrdered()forEach()sourceListdestinationList

但是,如其他答案中所述,使用是从 生成输出的正确方法。collect(Collectors.toList())ListStream


推荐