有趣的多线程:累计相加-CompletableFuture优化

不优雅的地方

  1. 对结果的获取
  2. 需要额外引入CountDownLatch等待所有线程执行完毕

CompletableFuture

Future接口天然可以通过回调获取结果,所以可以利用CompletableFuture实现并行,并调用CompletableFuture.join获取结果

private static void completableFuture(BigInteger n, int m) {
        //1. 还是先将任务拆分,一定要考虑除不尽的情况
        BigInteger part = n.divide(BigInteger.valueOf(m));
        LinkedList<BigInteger[]> taskList = new LinkedList<>();
        if (part.multiply(BigInteger.valueOf(m)).compareTo(n) != 0) {
            taskList.addLast(new BigInteger[]{part.multiply(BigInteger.valueOf(m)).add(BigInteger.ONE), n});
        }

        for (int i = 1; i <= m; i++) {
            BigInteger bigInteger = part.multiply(BigInteger.valueOf(i));
            taskList.addLast(new BigInteger[]{bigInteger.subtract(part).add(BigInteger.ONE), bigInteger});
        }

        // 2. 利用CompletableFuture实现并行,并调用 CompletableFuture.join获取结果
        Optional<BigInteger> result = taskList.stream().map(bigIntegerArray -> CompletableFuture.supplyAsync(() -> {
            BigInteger sum = BigInteger.ZERO;
            for (BigInteger i = bigIntegerArray[0]; i.compareTo(bigIntegerArray[1]) <= 0; i = i.add(BigInteger.ONE)) {
                sum = sum.add(i);
            }
            return sum;
        })).collect(Collectors.toList()).stream().map(CompletableFuture::join).reduce(BigInteger::add);

        result.ifPresent(System.out::println);
    }

在这里插入图片描述

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值