一.优先获取执行最快的线程任务
在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();
输出结果:
要知道的是这个合并任务会等待需要有返回值的异步任务全都执行完毕之后才会执行.