我需要加快程序速度,并通过将.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));
});
如果汽车有60个对象,则carList包含60个预期的对象。
如果汽车有60个对象,则carList包含36个对象。
答案 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必须是线程安全的。