java 8并行流问题

标签 java parallel-processing java-8 parallel.foreach

    _logger.info("data size : "+saleData.size);

    saleData.parallelStream().forEach(data -> {
                SaleAggrData saleAggrData = new SaleAggrData() {
                    {
                        setCatId(data.getCatId());
                        setRevenue(RoundUpUtil.roundUpDouble(data.getRevenue()));
                        setMargin(RoundUpUtil.roundUpDouble(data.getMargin()));
                        setUnits(data.getUnits());
                        setMarginRate(ComputeUtil.marginRate(data.getRevenue(), data.getMargin()));
                        setOtd(ComputeUtil.OTD(data.getRevenue(), data.getUnits()));
                        setSaleDate(data.getSaleDate());
                        setDiscountDepth(ComputeUtil.discountDepth(data.getRegularPrice(), data.getRevenue()));
                        setTransactions(data.getTransactions());
                        setUpt(ComputeUtil.UPT(data.getUnits(), data.getTransactions()));
                    }
                };
                salesAggrData.addSaleAggrData(saleAggrData);
            });

代码的问题是,当我从数据库获取响应时,在使用并行流进行迭代时,数据大小每次都不同,而在使用顺序流时则工作正常。

我无法使用顺序Stream,因为数据很大并且需要时间。

任何线索都会有帮助。

最佳答案

您正在向 salesAggrData 并行添加元素,我假设它是一些Collection。如果它不是线程安全的Collection,难怪你会得到不一致的结果。

为什么不使用 forEach,而使用 map() 然后将结果收集到某个 Collection 中?

List<SaleAggrData> salesAggrData =
    saleData.parallelStream()
            .map(data -> {
                    SaleAggrData saleAggrData = new SaleAggrData() {
                        {
                            setCatId(data.getCatId());
                            setRevenue(RoundUpUtil.roundUpDouble(data.getRevenue()));
                            setMargin(RoundUpUtil.roundUpDouble(data.getMargin()));
                            setUnits(data.getUnits());
                            setMarginRate(ComputeUtil.marginRate(data.getRevenue(), data.getMargin()));
                            setOtd(ComputeUtil.OTD(data.getRevenue(), data.getUnits()));
                            setSaleDate(data.getSaleDate());
                            setDiscountDepth(ComputeUtil.discountDepth(data.getRegularPrice(), data.getRevenue()));
                            setTransactions(data.getTransactions());
                            setUpt(ComputeUtil.UPT(data.getUnits(), data.getTransactions()));
                        }
                    };
                    return saleAggrData;
            })
            .collect(Collectors.toList());

顺便说一句,我可能会更改匿名类实例的创建,并使用命名类的构造函数来创建 SaleAggrData 实例。

关于java 8并行流问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48900204/

相关文章:

php - 与 Gearman 并行化

c++ - 并发:C++11 内存模型中的原子性和 volatile

java - 在 map 界面应用过滤器和 map 后如何同时显示键和值?

java - JAVA 中的 Streams 聚合,这是一个好方法吗?

java - 当我只做一个列表时,为什么 Hibernate 会删除我的集合条目?

java - FindBugs 生成不同格式的报告

c - OpenMP 线程处理的迭代索引

generics - 将字节数组反序列化为名称为 String 的类

java - 为 JButton 设置背景颜色

java - 使用 Jackson 转换为 JSON 时处理空 XML 节点