1、串行执行
CompletableFuture<String> future
= CompletableFuture.supplyAsync(() -> "串行执行1")
.thenApply(s -> s + "串行执行2")
.thenApply(String::toUpperCase);
System.out.println(future.join());
/*
输出结果:
串行执行1串行执行2
*/
2、并行执行,接口耗时取决于最慢的那个方法
CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> {
Thread.sleep(5000L);
System.out.println("future1休眠5秒");
});
CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> {
Thread.sleep(1000L);
System.out.println("future2休眠1秒");
});
CompletableFuture<Void> future3 = CompletableFuture.runAsync(() -> {
Thread.sleep(4000L);
System.out.println("future3休眠4秒");
});
CompletableFuture<Void> future4 = CompletableFuture.runAsync(() -> {
Thread.sleep(2000L);
System.out.println("future4休眠2秒");
});
CompletableFuture<Void> allOf = CompletableFuture.allOf(future1, future2, future3, future4);
allOf.get();
System.out.println("全部执行完成");
2、AND汇聚,future1和future2都执行完成再执行future3
// 有返回值方法supplyAsync()
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
Thread.sleep(5000L);
System.out.println("future1休眠5秒");
return "future1休眠5秒";
});
// 无返回值方法runAsync()
CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> {
Thread.sleep(1000L);
System.out.println("future2休眠1秒");
});
CompletableFuture<String> future3 = future1.thenCombine(future2, (param1, param2) -> {
return "先执行future1和future2,再future3";
});
System.out.println(stringCompletableFuture3.join());
/*
输出结果:
future2休眠1秒
future1休眠5秒
先执行future1和future2,再future3
*/
3、OR汇聚,future1和future2任意一个行完成就执行future3
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
Thread.sleep(5000L);
System.out.println("future1休眠5秒");
return "future1执行完成";
});
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
Thread.sleep(1000L);
System.out.println("future2休眠1秒");
return "future2执行完成";
});
CompletableFuture<String> future3 = future1.applyToEither(future2, param -> {
System.out.println(param);
return "future3执行完成";
});
System.out.println(future3.join());
/*
输出结果:
future2休眠1秒
future2执行完成
future3执行完成
*/