CompletableFuture中需要多个异步任务执行,再执行异步操作,allOf和anyOf
1. allOf: CompletableFuture是多个任务执行完成后才会执行,有一个任务执行异常CompletableFuture执行get()方法就会抛出异常,如果正常执行,get返回null.
List<String> fileList = Arrays.asList("news1.txt", "news2.txt", "news.txt");
List<CompletableFuture<String>> fileFutureList = fileList.stream().map(fileName -> {
return readFile(fileName);
}).toList();
int size = fileFutureList.size();
CompletableFuture[] futures = fileFutureList.toArray(new CompletableFuture[size]);
CompletableFuture<Void> allOfFuture = CompletableFuture.allOf(futures);
CompletableFuture<Long> countFuture = allOfFuture.thenApply(r ->
fileFutureList.stream()
.map(future -> future.join())
.filter(content -> content.contains("CompletableFuture"))
.count()
);
Long count = countFuture.get();
CommonUtil.printThreadLog(count+"");
2. anyOf: CompletableFuture多个任务只要有一个任务完成,get()则返回任务结果,如果所有任务未返回前任务异常get()抛出异常
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
CommonUtil.sleepSecond(3);
return "future1";
});
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
CommonUtil.sleepSecond(2);
return "future2";
});
CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> {
CommonUtil.sleepSecond(4);
return "future3";
});
CompletableFuture<Object> anyOfFuture = CompletableFuture.anyOf(future1, future2, future3);
Object join = anyOfFuture.join();
CommonUtil.printThreadLog(join+"");