我使用这个方法来初始化一个带有默认值的 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/