Java使用多线程优化代码性能:从同步到异步的转变


在日常开发中,随着业务复杂度的增加,代码的性能优化变得越来越重要。今天,我想和大家分享一个真实的案例,通过将同步调用改为异步多线程来显著提升系统性能。我们将通过对比两段代码来逐个展示这种优化的效果。

原始代码与改进代码的逐点对比

1. 获取订单信息

在原始代码中,我们通过同步调用orderInfoFeignClient.getOrderInfo方法获取订单信息,并且立即进行司机身份的校验。这种同步调用在等待外部服务响应时会阻塞线程,增加了整体的执行时间。

原始代码:

OrderInfo orderInfo = orderInfoFeignClient.getOrderInfo(orderFeeForm.getOrderId()).getData();
if (orderInfo.getDriverId() != orderFeeForm.getDriverId()) {
    throw new GuiguException(ResultCodeEnum.ILLEGAL_REQUEST);
}

改进后的代码:

CompletableFuture<OrderInfo> orderInfoCompletableFuture = CompletableFuture.supplyAsync(() -> {
    OrderInfo orderInfo = orderInfoFeignClient.getOrderInfo(orderFeeForm.getOrderId()).getData();
    if (orderInfo.getDriverId() != orderFeeForm.getDriverId()) {
        throw new GuiguException(ResultCodeEnum.ILLEGAL_REQUEST);
    }
    return orderInfo;
});

在改进后的代码中,我们使用了CompletableFuture.supplyAsync进行异步调用,使获取订单信息的操作不再阻塞主线程。这可以显著减少等待时间,并允许其他任务并行执行。

2. 防止刷单逻辑

在原始代码中,我们在获取订单信息之后,再通过同步调用locationFeignClient.getOrderServiceLastLocation来获取订单的最后位置。这种串行处理会导致整个流程被这两个同步调用的总耗时所拖慢。

原始代码:

OrderServiceLastLocationVo orderServiceLastLocationVo = locationFeignClient
        .getOrderServiceLastLocation(orderFeeForm.getOrderId()).getData();
double distance = LocationUtil.getDistance(
        orderInfo.getEndPointLatitude().doubleValue(),
        orderInfo.getEndPointLongitude().doubleValue(),
        orderServiceLastLocationVo.getLatitude().doubleValue(),
        orderServiceLastLocationVo.getLongitude().doubleValue()
);
if (distance > SystemConstant.DRIVER_END_LOCATION_DISTION) {
    throw new GuiguException(ResultCodeEnum.DRIVER_END_LOCATION_DISTION_ERROR);
}

改进后的代码:

CompletableFuture<OrderServiceLastLocationVo> orderServiceLastLocationVoCompletableFuture =
        CompletableFuture.supplyAsync(() -> {
            OrderServiceLastLocationVo orderServiceLastLocationVo =
                    locationFeignClient.getOrderServiceLastLocation(orderFeeForm.getOrderId()).getData();
            return orderServiceLastLocationVo;
        });

CompletableFuture.allOf(orderInfoCompletableFuture, orderServiceLastLocationVoCompletableFuture).join();

OrderInfo orderInfo = orderInfoCompletableFuture.get();
OrderServiceLastLocationVo orderServiceLastLocationVo = orderServiceLastLocationVoCompletableFuture.get();
double distance = LocationUtil.getDistance(
        orderInfo.getEndPointLatitude().doubleValue(),
        orderInfo.getEndPointLongitude().doubleValue(),
        orderServiceLastLocationVo.getLatitude().doubleValue(),
        orderServiceLastLocationVo.getLongitude().doubleValue()
);
if (distance > SystemConstant.DRIVER_END_LOCATION_DISTION) {
    throw new GuiguException(ResultCodeEnum.DRIVER_END_LOCATION_DISTION_ERROR);
}

改进后的代码使用了CompletableFuture.allOf并行处理获取订单信息和订单最后位置的操作,大大缩短了这两个操作的总耗时。同时,通过join()方法等待这两个操作完成后再继续执行后续逻辑。

3. 计算订单实际里程

在原始代码中,订单的实际里程是通过同步调用locationFeignClient.calculateOrderRealDistance来获取的,这同样是一个阻塞的操作。

原始代码:

BigDecimal realDistance = locationFeignClient.calculateOrderRealDistance(orderFeeForm.getOrderId()).getData();

改进后的代码:

CompletableFuture<BigDecimal> realDistanceCompletableFuture = CompletableFuture.supplyAsync(() -> {
    BigDecimal realDistance = locationFeignClient.calculateOrderRealDistance(orderFeeForm.getOrderId()).getData();
    return realDistance;
});

改进后的代码将这一操作变为异步,允许它与其他操作并行执行,从而减少整体的处理时间。

4. 计算实际费用

计算订单的实际费用需要结合之前的里程计算结果。在原始代码中,这是同步调用。

原始代码:

FeeRuleRequestForm feeRuleRequestForm = new FeeRuleRequestForm();
feeRuleRequestForm.setDistance(realDistance);
feeRuleRequestForm.setStartTime(orderInfo.getStartServiceTime());
// 计算司机到达代驾开始时间
Integer waitMinute = Math.abs(
        (int) ((orderInfo.getArriveTime().getTime() - orderInfo.getAcceptTime().getTime()) / (1000 * 60))
);
feeRuleRequestForm.setWaitMinute(waitMinute);
FeeRuleResponseVo feeRuleResponseVo = feeRuleFeignClient.calculateOrderFee(feeRuleRequestForm).getData();

BigDecimal totalAmount = feeRuleResponseVo.getTotalAmount()
                                          .add(orderFeeForm.getTollFee())
                                          .add(orderFeeForm.getParkingFee())
                                          .add(orderFeeForm.getOtherFee())
                                          .add(orderInfo.getFavourFee());
feeRuleResponseVo.setTotalAmount(totalAmount);

改进后的代码:

CompletableFuture<FeeRuleResponseVo> feeRuleResponseVoCompletableFuture =
        realDistanceCompletableFuture.thenApplyAsync((realDistance) -> {
            FeeRuleRequestForm feeRuleRequestForm = new FeeRuleRequestForm();
            feeRuleRequestForm.setDistance(realDistance);
            feeRuleRequestForm.setStartTime(orderInfo.getStartServiceTime());
            Integer waitMinute = Math.abs(
                    (int) ((orderInfo.getArriveTime().getTime() - orderInfo.getAcceptTime().getTime()) / (1000 * 60))
            );
            feeRuleRequestForm.setWaitMinute(waitMinute);
            FeeRuleResponseVo feeRuleResponseVo = feeRuleFeignClient.calculateOrderFee(feeRuleRequestForm).getData();
            BigDecimal totalAmount = feeRuleResponseVo.getTotalAmount()
                                                      .add(orderFeeForm.getTollFee())
                                                      .add(orderFeeForm.getParkingFee())
                                                      .add(orderFeeForm.getOtherFee())
                                                      .add(orderInfo.getFavourFee());
            feeRuleResponseVo.setTotalAmount(totalAmount);
            return feeRuleResponseVo;
        });

通过将实际费用的计算过程作为一个异步任务,并利用前面的realDistance异步计算结果,改进后的代码使整体流程更加高效。

5. 计算系统奖励

同样,系统奖励的计算在原始代码中是同步操作,需要等待订单数的查询结果。

原始代码:

String startTime = new DateTime(orderInfo.getStartServiceTime()).toString("yyyy-MM-dd") + " 00:00:00";
String endTime = new DateTime(orderInfo.getStartServiceTime()).toString("yyyy-MM-dd") + " 24:00:00";
Long orderNum = orderInfoFeignClient.getOrderNumByTime(startTime, endTime).getData();

RewardRuleRequestForm rewardRuleRequestForm = new RewardRuleRequestForm();
rewardRuleRequestForm.setStartTime(orderInfo.getStartServiceTime());
rewardRuleRequestForm.setOrderNum(orderNum);
RewardRuleResponseVo rewardRuleResponseVo = rewardRuleFeignClient.calculateOrderRewardFee(rewardRuleRequestForm).getData();

改进后的代码:

CompletableFuture<Long> orderNumCompletableFuture = CompletableFuture.supplyAsync(() -> {
    String startTime = new DateTime(orderInfo.getStartServiceTime()).toString("yyyy-MM-dd") + " 00:00:00";
    String endTime = new DateTime(orderInfo.getStartServiceTime()).toString("yyyy-MM-dd") + " 24:00:00";
    Long orderNum = orderInfoFeignClient.getOrderNumByTime(startTime, endTime).getData();
    return orderNum;
});

CompletableFuture<RewardRuleResponseVo> rewardRuleResponseVoCompletableFuture =
        orderNumCompletableFuture.thenApplyAsync((orderNum) -> {
            RewardRuleRequestForm rewardRuleRequestForm = new RewardRuleRequestForm();
            rewardRuleRequestForm.setStartTime(orderInfo.getStartServiceTime());
            rewardRuleRequestForm.setOrderNum(orderNum);
            RewardRuleResponseVo rewardRuleResponseVo = rewardRuleFeignClient.calculateOrderRewardFee(rewardRuleRequestForm).getData();
            return rewardRuleResponseVo;
        });

通过异步处理订单数量的查询和奖励的计算,改进后的代码在保持业务逻辑完整性的前提下,减少了同步调用带来的延迟。

6. 计算分账信息

分账信息的计算依赖于前面计算的实际费用和订单数量。在原始代码中,所有操作都是串行的,等待时间较长。

原始代码:

ProfitsharingRuleRequestForm profitsharingRuleRequestForm = new ProfitsharingRuleRequestForm();
profitsharingRuleRequestForm.setOrderAmount(feeRuleResponseVo.getTotalAmount());
profitsharingRuleRequestForm.setOrderNum(orderNum);
ProfitsharingRuleResponseVo profitsharingRuleResponseVo = profitsharingRuleFeignClient.calculateOrderProfitsharingFee(profitsharingRuleRequestForm).getData();

改进后的代码:

CompletableFuture<ProfitsharingRuleResponseVo> profitsharingRuleResponseVoCompletableFuture =
        feeRuleResponseVoCompletableFuture.thenCombineAsync(orderNumCompletableFuture, (feeRuleResponseVo, orderNum) -> {
            ProfitsharingRuleRequestForm profitsharingRuleRequestForm = new ProfitsharingRuleRequestForm();
            profitsharingRuleRequestForm.setOrderAmount(feeRuleResponseVo.getTotalAmount());
            profitsharingRuleRequestForm.setOrderNum(orderNum);
            ProfitsharingRuleResponseVo profitsharingRuleResponseVo = profitsharingRuleFeignClient.calculateOrderProfitsharingFee(profitsharingRuleRequestForm).getData();
            return profitsharingRuleResponseVo;
        });

通过将分账计算与之前的异步任务结合,改进后的代码进一步缩短了总的执行时间。

7. 更新订单和生成账单

最后,在所有数据准备完毕后,更新订单并生成账单的逻辑在改进后的代码中并未发生变化。这是因为该操作需要等待所有前置操作完成后才能执行。

原始代码:

UpdateOrderBillForm updateOrderBillForm = new UpdateOrderBillForm();
updateOrderBillForm.setOrderId(orderFeeForm.getOrderId());
updateOrderBillForm.setDriverId(orderFeeForm.getDriverId());
updateOrderBillForm.setTollFee(orderFeeForm.getTollFee());
updateOrderBillForm.setParkingFee(orderFeeForm.getParkingFee());
updateOrderBillForm.setOtherFee(orderFeeForm.getOtherFee());
updateOrderBillForm.setFavourFee(orderInfo.getFavourFee());
updateOrderBillForm.setRealDistance(realDistance);

BeanUtils.copyProperties(rewardRuleResponseVo, updateOrderBillForm);
BeanUtils.copyProperties(feeRuleResponseVo, updateOrderBillForm);
BeanUtils.copyProperties(profitsharingRuleResponseVo, updateOrderBillForm);
updateOrderBillForm.setProfitsharingRuleId(profitsharingRuleResponseVo.getProfitsharingRuleId());

orderInfoFeignClient.endDrive(updateOrderBillForm);
return true;

改进后的代码:

UpdateOrderBillForm updateOrderBillForm = new UpdateOrderBillForm();
updateOrderBillForm.setOrderId(orderFeeForm.getOrderId());
updateOrderBillForm.setDriverId(orderFeeForm.getDriverId());
updateOrderBillForm.setTollFee(orderFeeForm.getTollFee());
updateOrderBillForm.setParkingFee(orderFeeForm.getParkingFee());
updateOrderBillForm.setOtherFee(orderFeeForm.getOtherFee());
updateOrderBillForm.setFavourFee(orderInfo.getFavourFee());

updateOrderBillForm.setRealDistance(realDistance);
BeanUtils.copyProperties(rewardRuleResponseVo, updateOrderBillForm);
BeanUtils.copyProperties(feeRuleResponseVo, updateOrderBillForm);
BeanUtils.copyProperties(profitsharingRuleResponseVo, updateOrderBillForm);
updateOrderBillForm.setProfitsharingRuleId(profitsharingRuleResponseVo.getProfitsharingRuleId());

orderInfoFeignClient.endDrive(updateOrderBillForm);
return true;

在这一步,改进后的代码也在逻辑上保持了与原始代码的一致性,但由于前面的异步优化,这一步的执行将更为高效。

完整代码展示

原始代码:
@Override
public Boolean endDrive(OrderFeeForm orderFeeForm) {
    // 1.根据订单id获取订单信息,判断当前订单是否是司机接单
    OrderInfo orderInfo = orderInfoFeignClient.getOrderInfo(orderFeeForm.getOrderId()).getData();
    if (orderInfo.getDriverId() != orderFeeForm.getDriverId()) {
        throw new GuiguException(ResultCodeEnum.ILLEGAL_REQUEST);
    }

    // 防止刷单
    OrderServiceLastLocationVo orderServiceLastLocationVo = locationFeignClient
            .getOrderServiceLastLocation(orderFeeForm.getOrderId()).getData();
    double distance = LocationUtil.getDistance(
            orderInfo.getEndPointLatitude().doubleValue(),
            orderInfo.getEndPointLongitude().doubleValue(),
            orderServiceLastLocationVo.getLatitude().doubleValue(),
            orderServiceLastLocationVo.getLongitude().doubleValue()
                                              );
    if (distance > SystemConstant.DRIVER_END_LOCATION_DISTION) {
        throw new GuiguException(ResultCodeEnum.DRIVER_END_LOCATION_DISTION_ERROR);
    }

    // 2.计算订单实际里程
    BigDecimal realDistance = locationFeignClient.calculateOrderRealDistance(orderFeeForm.getOrderId()).getData();

    // 3.计算实际费用
    FeeRuleRequestForm feeRuleRequestForm = new FeeRuleRequestForm();
    feeRuleRequestForm.setDistance(realDistance);
    feeRuleRequestForm.setStartTime(orderInfo.getStartServiceTime());

    // 计算司机到达代驾开始时间
    Integer waitMinute = Math.abs(
            (int) ((orderInfo.getArriveTime().getTime() - orderInfo.getAcceptTime().getTime()) / (1000 * 60))
                                 );
    feeRuleRequestForm.setWaitMinute(waitMinute);
    FeeRuleResponseVo feeRuleResponseVo = feeRuleFeignClient.calculateOrderFee(feeRuleRequestForm).getData();

    // 实际费用
    BigDecimal totalAmount = feeRuleResponseVo.getTotalAmount()
                                              .add(orderFeeForm.getTollFee())
                                              .add(orderFeeForm.getParkingFee())
                                              .add(orderFeeForm.getOtherFee())
                                              .add(orderInfo.getFavourFee());
    feeRuleResponseVo.setTotalAmount(totalAmount);

    // 4.计算系统奖励
    String startTime = new DateTime(orderInfo.getStartServiceTime()).toString("yyyy-MM-dd") + " 00:00:00";
    String endTime = new DateTime(orderInfo.getStartServiceTime()).toString("yyyy-MM-dd") + " 24:00:00";
    Long orderNum = orderInfoFeignClient.getOrderNumByTime(startTime, endTime).getData();

    // 4.2 封装参数
    RewardRuleRequestForm rewardRuleRequestForm = new RewardRuleRequestForm();
    rewardRuleRequestForm.setStartTime(orderInfo.getStartServiceTime());
    rewardRuleRequestForm.setOrderNum(orderNum);
    RewardRuleResponseVo rewardRuleResponseVo = rewardRuleFeignClient
            .calculateOrderRewardFee(rewardRuleRequestForm).getData();

    // 5.计算分账信息
    ProfitsharingRuleRequestForm profitsharingRuleRequestForm = new ProfitsharingRuleRequestForm();
    profitsharingRuleRequestForm.setOrderAmount(feeRuleResponseVo.getTotalAmount());
    profitsharingRuleRequestForm.setOrderNum(orderNum);
    ProfitsharingRuleResponseVo profitsharingRuleResponseVo = profitsharingRuleFeignClient
            .calculateOrderProfitsharingFee(profitsharingRuleRequestForm).getData();

    // 6.封装实体类,结束代驾更新订单,添加账单和分账信息
    UpdateOrderBillForm updateOrderBillForm = new UpdateOrderBillForm();
    updateOrderBillForm.setOrderId(orderFeeForm.getOrderId());
    updateOrderBillForm.setDriverId(orderFeeForm.getDriverId());
    updateOrderBillForm.setTollFee(orderFeeForm.getTollFee());
    updateOrderBillForm.setParkingFee(orderFeeForm.getParkingFee());
    updateOrderBillForm.setOtherFee(orderFeeForm.getOtherFee());
    updateOrderBillForm.setFavourFee(orderInfo.getFavourFee());
    updateOrderBillForm.setRealDistance(realDistance);

    // 订单奖励信息
    BeanUtils.copyProperties(rewardRuleResponseVo, updateOrderBillForm);
    // 代驾费用信息
    BeanUtils.copyProperties(feeRuleResponseVo, updateOrderBillForm);
    // 分账相关信息
    BeanUtils.copyProperties(profitsharingRuleResponseVo, updateOrderBillForm);
    updateOrderBillForm.setProfitsharingRuleId(profitsharingRuleResponseVo.getProfitsharingRuleId());

    orderInfoFeignClient.endDrive(updateOrderBillForm);
    return true;
}
改进后的代码:
// 使用多线程CompletableFuture优化
@SneakyThrows
public Boolean endDriveThread(OrderFeeForm orderFeeForm) {
    // 1.根据订单id获取订单信息,判断当前订单是否是司机接单
    CompletableFuture<OrderInfo> orderInfoCompletableFuture = CompletableFuture.supplyAsync(() -> {
        OrderInfo orderInfo = orderInfoFeignClient.getOrderInfo(orderFeeForm.getOrderId()).getData();
        if (orderInfo.getDriverId() != orderFeeForm.getDriverId()) {
            throw new GuiguException(ResultCodeEnum.ILLEGAL_REQUEST);
        }
        return orderInfo;
    });
    // 防止刷单
    CompletableFuture<OrderServiceLastLocationVo> orderServiceLastLocationVoCompletableFuture =
            CompletableFuture.supplyAsync(
                    () -> {
                        OrderServiceLastLocationVo orderServiceLastLocationVo =
                                locationFeignClient.getOrderServiceLastLocation(
                                        orderFeeForm.getOrderId()).getData();
                        return orderServiceLastLocationVo;
                    });

    // 上面两个合并
    CompletableFuture.allOf(orderInfoCompletableFuture, orderServiceLastLocationVoCompletableFuture).join();
    // 获取两个线程执行结果
    OrderInfo orderInfo = orderInfoCompletableFuture.get();
    OrderServiceLastLocationVo orderServiceLastLocationVo = orderServiceLastLocationVoCompletableFuture.get();
    // 司机当前位置,距离,结束代驾位置
    double distance = LocationUtil.getDistance(orderInfo.getEndPointLatitude().doubleValue(),
                                               orderInfo.getEndPointLongitude().doubleValue(),
                                               orderServiceLastLocationVo.getLatitude().doubleValue(),
                                               orderServiceLastLocationVo.getLongitude().doubleValue());
    if (distance > SystemConstant.DRIVER_END_LOCATION_DISTION) {
        throw new GuiguException(ResultCodeEnum.DRIVER_END_LOCATION_DISTION_ERROR);
    }
    // 2.计算订单实际里程
    CompletableFuture<BigDecimal> realDistanceCompletableFuture = CompletableFuture.supplyAsync(() -> {
        BigDecimal realDistance = locationFeignClient.calculateOrderRealDistance(orderFeeForm.getOrderId())
                                                     .getData();
        return realDistance;
    });

    // 3.计算代实际费用
    CompletableFuture<FeeRuleResponseVo> feeRuleResponseVoCompletableFuture =
            realDistanceCompletableFuture.thenApplyAsync(
                    (realDistance) -> {
                        // 实际费用=代驾费用+其他费用
                        // 封装对象
                        FeeRuleRequestForm feeRuleRequestForm = new FeeRuleRequestForm();
                        feeRuleRequestForm.setDistance(realDistance);
                        feeRuleRequestForm.setStartTime(orderInfo.getStartServiceTime());
                        // 计算司机到达代驾开始时间
                        Integer waitMinute = Math.abs(
                                (int) ((orderInfo.getArriveTime().getTime() - orderInfo.getAcceptTime()
                                                                                       .getTime()) / (1000 * 60)));
                        feeRuleRequestForm.setWaitMinute(waitMinute);
                        FeeRuleResponseVo feeRuleResponseVo = feeRuleFeignClient.calculateOrderFee(
                                                                                        feeRuleRequestForm)
                                                                                .getData();
                        // 实际费用
                        BigDecimal totalAmount = feeRuleResponseVo.getTotalAmount().add(orderFeeForm.getTollFee())
                                                                  .add(orderFeeForm.getParkingFee())
                                                                  .add(orderFeeForm.getOtherFee())
                                                                  .add(orderInfo.getFavourFee());
                        feeRuleResponseVo.setTotalAmount(totalAmount);
                        return feeRuleResponseVo;
                    });

    // 4.计算系统奖励
    CompletableFuture<Long> orderNumCompletableFuture = CompletableFuture.supplyAsync(() -> {
        String startTime = new DateTime(orderInfo.getStartServiceTime()).toString("yyyy-MM-dd") + " 00:00:00";
        String endTime = new DateTime(orderInfo.getStartServiceTime()).toString("yyyy-MM-dd") + " 24:00:00";
        Long orderNum = orderInfoFeignClient.getOrderNumByTime(startTime, endTime).getData();
        return orderNum;
    });

    CompletableFuture<RewardRuleResponseVo> rewardRuleResponseVoCompletableFuture =
            orderNumCompletableFuture.thenApplyAsync(
                    (orderNum) -> {
                        // 4.2.封装参数
                        RewardRuleRequestForm rewardRuleRequestForm = new RewardRuleRequestForm();
                        rewardRuleRequestForm.setStartTime(orderInfo.getStartServiceTime());
                        rewardRuleRequestForm.setOrderNum(orderNum);
                        RewardRuleResponseVo rewardRuleResponseVo = rewardRuleFeignClient.calculateOrderRewardFee(
                                rewardRuleRequestForm).getData();
                        return rewardRuleResponseVo;
                    });


    // 5.计算分账信息
    CompletableFuture<ProfitsharingRuleResponseVo> profitsharingRuleResponseVoCompletableFuture =
            feeRuleResponseVoCompletableFuture.thenCombineAsync(
                    orderNumCompletableFuture, (feeRuleResponseVo, orderNum) -> {
                        ProfitsharingRuleRequestForm profitsharingRuleRequestForm =
                                new ProfitsharingRuleRequestForm();
                        profitsharingRuleRequestForm.setOrderAmount(feeRuleResponseVo.getTotalAmount());
                        profitsharingRuleRequestForm.setOrderNum(orderNum);
                        ProfitsharingRuleResponseVo profitsharingRuleResponseVo =
                                profitsharingRuleFeignClient.calculateOrderProfitsharingFee(
                                        profitsharingRuleRequestForm).getData();
                        return profitsharingRuleResponseVo;
                    });
    // 合并
    CompletableFuture.allOf(orderInfoCompletableFuture, realDistanceCompletableFuture,
                            feeRuleResponseVoCompletableFuture, orderNumCompletableFuture,
                            rewardRuleResponseVoCompletableFuture, profitsharingRuleResponseVoCompletableFuture)
                     .join();
    // 获取执行结果
    BigDecimal realDistance = realDistanceCompletableFuture.get();
    FeeRuleResponseVo feeRuleResponseVo = feeRuleResponseVoCompletableFuture.get();
    RewardRuleResponseVo rewardRuleResponseVo = rewardRuleResponseVoCompletableFuture.get();
    ProfitsharingRuleResponseVo profitsharingRuleResponseVo = profitsharingRuleResponseVoCompletableFuture.get();
    // 6.封装实体类,结束代驾更新订单,添加账单和分账信息
    UpdateOrderBillForm updateOrderBillForm = new UpdateOrderBillForm();
    updateOrderBillForm.setOrderId(orderFeeForm.getOrderId());
    updateOrderBillForm.setDriverId(orderFeeForm.getDriverId());
    // 路桥费、停车费、其他费用
    updateOrderBillForm.setTollFee(orderFeeForm.getTollFee());
    updateOrderBillForm.setParkingFee(orderFeeForm.getParkingFee());
    updateOrderBillForm.setOtherFee(orderFeeForm.getOtherFee());
    // 乘客好处费
    updateOrderBillForm.setFavourFee(orderInfo.getFavourFee());

    // 实际里程
    updateOrderBillForm.setRealDistance(realDistance);
    // 订单奖励信息
    BeanUtils.copyProperties(rewardRuleResponseVo, updateOrderBillForm);
    // 代驾费用信息
    BeanUtils.copyProperties(feeRuleResponseVo, updateOrderBillForm);
    // 分账相关信息
    BeanUtils.copyProperties(profitsharingRuleResponseVo, updateOrderBillForm);
    updateOrderBillForm.setProfitsharingRuleId(profitsharingRuleResponseVo.getProfitsharingRuleId());
    orderInfoFeignClient.endDrive(updateOrderBillForm);
    return true;
}

总结

通过对比可以发现,改进后的代码在处理外部服务调用时,通过CompletableFuture实现了异步并行执行,极大地提高了代码的执行效率。这种优化方式不仅减少了整体的等待时间,还能够更好地利用系统资源。

主要的改进点包括:

  1. 多线程并行处理:利用CompletableFuture实现异步调用,大幅减少顺序执行带来的延迟。
  2. 代码结构优化:通过异步编程,代码逻辑更加清晰,易于维护和扩展。
  3. 异常处理:在异步任务中也能够有效处理可能出现的异常,保证系统的稳定性。

总的来说,随着业务规模的扩展,性能优化是不可忽视的一个重要环节。而多线程与异步编程正是优化系统性能的一把利器,合理的使用能够显著提升系统的响应速度和用户体验。希望这篇博客对你在实际开发中的性能优化有所启发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值