有趣的多线程:累计相加-CompletableFuture优化
2023-12-26 06:04:58
不优雅的地方
- 对结果的获取
- 需要额外引入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);
}
文章来源:https://blog.csdn.net/AK47red/article/details/135211493
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!