本文主要是介绍有趣的多线程:累计相加-CompletableFuture优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
不优雅的地方
- 对结果的获取
- 需要额外引入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);}
这篇关于有趣的多线程:累计相加-CompletableFuture优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!