Guava中并发ListenableFuture使用

本文介绍如何利用Guava的ListenableFuture实现数据库插入操作的并发处理,通过实例展示了如何将原本串行的多个表插入操作转换为并行执行,有效提升了客户端上传数据到服务端的性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在项目中要优化接口,发现guava并发编程中的ListenableFuture比较适合,所以就用上了。感觉还不错,分享一下。使用场景是这样的,客户端需要上传数据到服务端,涉及到几个表的插入。之前都是一个一个表插入的,性能不是很好的。现在改为并发插入,代码如下:

private ListeningExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2));

 private String uploadData(final String entityId, TotalPayInfoVo totalPayInfoVo) throws ExecutionException, InterruptedException {
        totalPayInfoVo.setEntityId(entityId);

        List<ListenableFuture<?>> listenableFutures = new ArrayList<>();

        //保存账单信息
        final TotalPay totalPay = totalPayInfoVo.getTotalPay();
        final ServiceBillVO serviceBillVO = totalPayInfoVo.getServiceBillVO();
        if (totalPay != null || serviceBillVO != null) {
            listenableFutures.add(executorService.submit(new Runnable() {
                @Override
                public void run() {
                    saveOrUpdateTotalPay(entityId, totalPay, serviceBillVO);
                }
            }));
        }

        //保存订单和菜信息
        final List<OrderInfoVo> orderInfoVos = totalPayInfoVo.getOrderInfoVos();
        if (orderInfoVos != null && !orderInfoVos.isEmpty()) {
            listenableFutures.add(executorService.submit(new Callable<String>() {
                public String call() {
                    String result = null;
                    for (OrderInfoVo orderInfoVo : orderInfoVos) {
                        result = saveOrUpdateOrder(entityId, orderInfoVo);
                        clearPrePayInfo(orderInfoVo.getOrder());
                    }
                    return result;
                }
            }));
        }

        //保存支付流水
        final List<Pay> pays = totalPayInfoVo.getPays();
        if (pays != null && !pays.isEmpty()) {
            listenableFutures.add(executorService.submit(new Runnable() {
                @Override
                public void run() {
                    saveOrUpdatePays(entityId, pays);
                }
            }));
        }

        //保存支付明细
        final List<PayDetail> payDetails = totalPayInfoVo.getPayDetails();
        if (payDetails != null && !payDetails.isEmpty()) {
            listenableFutures.add(executorService.submit(new Runnable() {
                @Override
                public void run() {
                    saveOrUpdatePayDetails(entityId, payDetails);
                }
            }));
        }

        //保存损益或者服务费
        final List<SpecialFee> specialFees = totalPayInfoVo.getSpecialFees();
        if (specialFees != null && !specialFees.isEmpty()) {
            listenableFutures.add(executorService.submit(new Runnable() {
                @Override
                public void run() {
                    saveOrUpdateSpecialFee(entityId, specialFees);
                }
            }));
        }

        String result = null;
        ListenableFuture<List<Object>> results = Futures.allAsList(listenableFutures);
        for (Object obj : results.get()) {
            if (obj != null) {
                result = obj.toString();
            }
        }

        return result;

    }

总结:ListenableFuture特别适合处理回调事件,以前用java标准库的Future都要自己处理回调。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值