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

标签 java parallel-processing java-stream

以下代码在完成并行处理后并未将所有元素放入目标列表中。这有什么原因吗?

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

最佳答案

因为 ArrayList 不是线程安全的集合。使用像 CopyOnWriteArrayList 这样的线程安全集合会使其正确但不一定有效。

改用 Collector 会更简单和正确。例如

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

关于java - 为什么 list.parallelStream().forEach() 不处理 Java 中列表中的所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60095513/

相关文章:

用于直接 I/O 的 Windows 内核驱动程序——有人去过那里吗?

Java 8 Stream 函数将变位词列表分组到列表映射中

java - 使用 IDEA,运行 spring mvc 应用程序,是否有构建和推送文件输出的快捷方式?

java在事件发生前单击2个按钮

java - 在Intellij idea Community Edition版本2016.1.1中我可以使用数据库吗?

exception - F# MailboxProcessor - 邮箱的多个等待读者延续

python - 将 ddp 后端与 PyTorch Lightning 一起使用时,在整个验证集上进行验证

java - LongSummaryStatistics 为什么要实现 IntConsumer?

java - 如何使用 Java 8 从对象列表中获取最小值和最大值

java - Java 问题简介