java - 并行流在任务完成之前完成

标签 java parallel-processing thread-safety java-stream

我使用这个方法来初始化一个带有默认值的 ArrayList:

private ArrayList<Integer> createArrayList(int size, int defaultValue)
{
    ArrayList<Integer> arrayList = new ArrayList<>(size);
    IntStream.range(0, size ).parallel().forEach(i->{arrayList.add(defaultValue);});

    return arrayList;
}

令人惊讶的是,如果我用单元测试检查返回数组的大小,它不是固定的数字,而且几乎总是小于请求的大小。

如果我删除 parallel(),它的大小总是符合要求。

为什么会这样?

最佳答案

当然它更小,您正在将来自多个线程的多个元素添加到非线程安全的ArrayList(当元素无法填充时会重新调整大小它是原始大小)。

您可以通过以下方式更简单地做到这一点:

Collections.nCopies(i, defaultValue);

关于java - 并行流在任务完成之前完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48342221/

相关文章:

java - 解析并保存文本文件中的行

java - Spring Mongodb Upsert 嵌套文档

java - 如何在java中格式化字符串 "012df3g4h5j6 78"=> "01 23 45 67 8"

r - mclapply 与 parLapply 速度

C# 4.0 从 Parallel.ForEach 中访问表单控件

C# 如何确保用户提供线程安全对象来运行

java - 向数据库插入数据时出现 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException

scala - Scala 2.9 并行集合如何在幕后工作?

java - 如果我不同步方法,后台发生了什么导致应用程序运行而控制台不打印任何内容?

java - 试图理解接受的答案 - Thread Safe Map of Queues