不明白为什么.stream()可以正常工作,但是.parallelStream()不能正常工作

时间:2019-05-05 15:43:51

标签: java java-stream

我需要加快程序速度,并通过将.stream()更改为.parallelStream()来进行尝试。

cars是汽车对象的列表。我使用每辆车的ID创建一个JsonCurrent,然后使用此jsonCurrent将新元素添加到carList。

当我使用.stream()时,它工作正常,但对于.parallelStream(),则不起作用。调试器显示,调用carService.createJson()时,JsonCurrent的所有字段均为空。

cars.parallelStream().forEach(car -> {
            JsonCurrent currentLocation = carPositionService.carPosition(car.getId());
            carList.add(carService.createJson(car, calendarWeek, currentWeek, currentLocation));
        });

.stream()

如果汽车有60个对象,则carList包含60个预期的对象。

.parallelStream()

如果汽车有60个对象,则carList包含36个对象。

2 个答案:

答案 0 :(得分:2)

如果0.24.2 a b 0 8.0 1.0 1 1.0 NaN 2 8.0 8.0 3 1.0 NaN 4 NaN 8.0 5 8.0 NaN 6 1.0 8.0 7 NaN 8.0 8 8.0 1.0 9 NaN 8.0 a b 0 8.0 1.0 1 1.0 NaN 2 8.0 8.0 3 1.0 8.0 4 NaN 8.0 5 8.0 8.0 6 1.0 8.0 7 NaN 8.0 8 8.0 1.0 9 8.0 8.0 引用的List实现不是线程安全的,那么使用并行流来填充它是一个坏主意。
如果将carList对象收集到JsonCurrent中而不是添加到现有列表中,则应该可以解决您的问题。您可以第二次在List中添加收集列表的所有元素,例如:

carList

但请注意,行为与无并行流不同:元素插入的顺序可能不同。
最后,关于性能差异,您应该使用JMH或专用于此的任何工具来认定这两种方法之间的真正差异。

答案 1 :(得分:1)

并行流可以用于无状态,关联和无干扰的操作,即

1)无状态操作:一个元素的状态不会影响另一个元素

2)不干扰操作:数据源不受影响

3)关联运算:结果不受操作数顺序的影响

因此,您的carList必须是线程安全的。