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

时间:2018-01-19 13:28:20

标签: 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(),则其大小始终按要求提供。

为什么会这样?

2 个答案:

答案 0 :(得分:10)

当然它更小,你将多个线程中的多个元素添加到非线程安全的template <typename T> requires C<T> void func(T t, T u); (当元素无法填充原始大小时,它会重新调整大小)。

你可以用以下方法做到这一点:

ArrayList

答案 1 :(得分:0)

使用线程安全的CopyOnWriteArrayList而不是ArrayList

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

    return list;
}