CompletableFuture6-优先获取执行最快的线程任务和结果合并

本文介绍了如何在Java的CompletableFuture中优先获取执行最快的线程任务,以及如何使用thenCombine方法对异步任务结果进行合并。通过示例代码展示了如何创建并运行异步任务,利用CompletableFuture.anyOf获取最先完成的任务,以及如何等待多个任务完成并合并它们的结果。

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

一.优先获取执行最快的线程任务

   在CompletableFuture中,提供了一种方式让我们能够优先获取返回最快的线程任务.
   就是将所有的异步任务的CompletableFuture对象封装到一个数组中,利用CompletableFuture.anyOf()方法获取到执行最快的异步任务对象,然后获取最快的返回值.
举例:
这里假设有五个异步任务,进行一些模拟业务操作.
为了便于演示,直接很明显的设置第二个异步任务最快,看是否能优先获取第二个异步任务得返回值.

 ArrayList<Integer> lists = Lists.newArrayList(1, 2, 3, 4, 5);
        CompletableFuture[] completableFutures = lists.stream().map(num -> CompletableFuture.supplyAsync(() -> {
            //模拟业务操作,这里直接设置第二个数值执行最快
            try {
                if(num != 2){
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("第"+num+"个异步任务执行完毕...");
            return num;
        },executorService)).toArray(CompletableFuture[]::new);
        //优先获取第一个执行完毕的线程任务对象
        CompletableFuture<Object> firstComletableFuture = CompletableFuture.anyOf(completableFutures);
        System.out.println("已经有任务优先执行完毕,获的返回值:"+firstComletableFuture.join());
        
        executorService.shutdown();

输出结果:
在这里插入图片描述
可以看到可以优先获取到执行完毕的线程,并且其他线程会正常执行完毕.

二.对异步任务结果进行合并

   有些时候我们可能有多个异步任务,并且某个异步任务依赖某两个甚至多个任务的返回结果,这个时候就可以对结果进行合并.
方法:thenCombine.
举例:

ExecutorService executorService = Executors.newFixedThreadPool(5);

        CompletableFuture<String> completableFuture1 = CompletableFuture.supplyAsync(() -> {
            System.out.println("第一个异步任务执行完毕...");
            return "hello ";
        }, executorService);

        CompletableFuture<String> completableFuture2 = CompletableFuture.supplyAsync(() -> {
            System.out.println("第二个异步任务执行完毕...");
            return "world";
        }, executorService);

        CompletableFuture<String> finalCompletableFutute = completableFuture1.thenCombine(completableFuture2, (result1, result2) -> {
            System.out.println("开始对获取结果进行处理,生成新的异步任务...");
            return result1 + result2;
        });

        System.out.println(finalCompletableFutute.join());
        executorService.shutdown();

输出结果:
在这里插入图片描述

要知道的是这个合并任务会等待需要有返回值的异步任务全都执行完毕之后才会执行.

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员bling

义父,感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值