學習參考文章:https://www.jianshu.com/p/6bac52527ca4(CompletableFuture 使用詳解)
上代碼:
package com.luck.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.CompletableFuture;
public class CompletableFutureUtil {
private static Logger logger = LoggerFactory.getLogger(CompletableFutureUtil.class);
public static void main(String[] args) throws Exception{
//logger.info("有返回結果: " + CompletableFutureUtil.asyncString().get());
//logger.info("沒有返回結果: " + CompletableFutureUtil.asyncVoid().get());
//logger.info("全部執行完畢返回: " + CompletableFutureUtil.asyncAll().get());
//logger.info("任意執行完畢返回: " + CompletableFutureUtil.asyncAny().get());
//logger.info("任務1執行完成後執行任務2(返回結果爲任務1): " + CompletableFutureUtil.whenComplete().get());
logger.info("任務1執行完成後執行任務2(返回結果爲任務2): " + CompletableFutureUtil.thenApply().get());
logger.info("任務1執行完成後執行任務2(返回結果爲任務2): " + CompletableFutureUtil.thenCompose().get());
//logger.info("任務1執行完成後執行任務2(返回結果爲任務2) 可處理異常: " + CompletableFutureUtil.handle().get());
//logger.info("任務1執行完成後執行任務2(無返回結果): " + CompletableFutureUtil.thenAccept().get());
//logger.info("任務1執行完成後執行任務2(無返回結果)不關注任務1結果: " + CompletableFutureUtil.thenRun().get());
//logger.info("合併任務,有結果:" + CompletableFutureUtil.thenCombine().get());
//logger.info("合併任務結果,無結果:" + CompletableFutureUtil.thenAcceptBoth().get());
//logger.info("任意執行完畢,進行下一步 - 接收結果 - 有返回結果:" + CompletableFutureUtil.applyToEither().get());
//logger.info("任意執行完畢,進行下一步 - 接收結果 - 無返回結果:" + CompletableFutureUtil.acceptEither().get());
//logger.info("任意執行完畢,進行下一步 - 不接收結果:" + CompletableFutureUtil.runAfterEither().get());
//logger.info("都執行結束,進行下一步 - 不接收結果: " + CompletableFutureUtil.runAfterBoth().get());
Thread.sleep(2000);
}
// 執行異步 -- 支持返回值
private static CompletableFuture<String> asyncString(){
return CompletableFuture
.supplyAsync(() -> CompletableFutureUtil.executeMethod("supplyAsync"));
}
// 執行異步 -- 不支持返回值
private static CompletableFuture<Void> asyncVoid() {
return CompletableFuture
.runAsync(() -> CompletableFutureUtil.executeMethod("runAsync"));
}
// 全部執行完畢返回
private static CompletableFuture<Void> asyncAll() {
return CompletableFuture.allOf(asyncString(), asyncVoid());
}
// 任意一個執行完畢返回
private static CompletableFuture<Object> asyncAny() {
return CompletableFuture.anyOf(asyncString(), asyncVoid());
}
// 任務1 執行完畢後 執行2 -- 不影響返回結果
private static CompletableFuture<String> whenComplete() {
CompletableFuture<String> stringCompletableFuture = asyncString();
CompletableFuture<String> stringCompletableFuture1 = stringCompletableFuture.whenComplete((a, b) -> {
a = "whenComplete處理返回結果";
logger.info("任務 asyncString 執行完畢: 結果" + a);
});
CompletableFuture<String> exceptionally = stringCompletableFuture.exceptionally((a) -> {
logger.info("任務 asyncString 執行失敗:" + a.getMessage());
return null;
});
return stringCompletableFuture1;
}
// 任務1 執行完成後 執行2 -- 影響返回結果 -- 串行化
private static CompletableFuture<String> thenApply() {
CompletableFuture<String> stringCompletableFuture = asyncString();
return stringCompletableFuture.thenApply((a) -> {
logger.info("任務 asyncString 執行完畢: 結果" + a);
return "thenApply處理返回結果" + a;
});
}
// 任務1 執行完成後 執行2 -- 影響返回結果 -- 串行化
private static CompletableFuture<String> thenCompose () {
CompletableFuture<String> stringCompletableFuture = asyncString();
return stringCompletableFuture.thenCompose(param -> CompletableFuture.supplyAsync(() -> {
logger.info("任務 asyncString 執行完畢: 結果" + param);
return "thenApply處理返回結果" + param;
}));
}
// 任務1 執行完成後 執行2 -- 影響返回結果 -- 可處理異常
private static CompletableFuture<String> handle() {
CompletableFuture<String> stringCompletableFuture = asyncString();
return stringCompletableFuture.handle((a, b) -> {
if (b != null) {
return "異常" + b.getMessage();
}
return "handle處理返回結果" + a;
});
}
// 任務1 執行完成後 執行2 -- 無返回結果 -- 接收任務1的值
private static CompletableFuture<Void> thenAccept() {
CompletableFuture<String> stringCompletableFuture = asyncString();
return stringCompletableFuture.thenAccept((a) -> {
logger.info("任務 asyncString 執行完畢: 結果" + a);
});
}
// 任務1 執行完成後 執行2 -- 無返回結果 -- 不接收任務1的值
private static CompletableFuture<Void> thenRun() {
CompletableFuture<String> stringCompletableFuture = asyncString();
return stringCompletableFuture.thenRun(() -> {
logger.info("任務 asyncString 執行完畢, 不關注結果." );
});
}
// 合併任務 -- 並返回結果
private static CompletableFuture<String> thenCombine() {
CompletableFuture<String> stringCompletableFuture = asyncString();
return stringCompletableFuture.thenCombine(asyncVoid(), (a, b) -> {
logger.info("a:{}, b:{}", a, b);
return "a+b:" + a + b;
});
}
// 合併任務 -- 無返回結果
private static CompletableFuture<Void> thenAcceptBoth() {
CompletableFuture<String> stringCompletableFuture = asyncString();
return stringCompletableFuture.thenAcceptBoth(asyncString(), (a, b) -> {
logger.info("a:{}, b:{}", a, b);
});
}
// 任意執行完畢,進行下一步 - 接收結果 - 有返回結果
private static CompletableFuture<String> applyToEither() {
CompletableFuture<String> stringCompletableFuture = asyncString();
return stringCompletableFuture.applyToEither(asyncString(), (a) -> {
logger.info("執行快的結果:{}", a);
return "執行快的結果:" + a;
});
}
// 任意執行完畢,進行下一步 - 接收結果 - 無返回結果
private static CompletableFuture<Void> acceptEither() {
CompletableFuture<String> stringCompletableFuture = asyncString();
return stringCompletableFuture.acceptEither(asyncString(), (a) -> {
logger.info("執行快的結果:{}", a);
});
}
// 任意執行完畢,進行下一步 - 不接收結果
private static CompletableFuture<Void> runAfterEither() {
CompletableFuture<String> stringCompletableFuture = asyncString();
return stringCompletableFuture.runAfterEither(asyncString(), () -> {
logger.info("已經有任務執行結束");
});
}
// 都執行結束,進行下一步 - 不接收結果
private static CompletableFuture<Void> runAfterBoth() {
CompletableFuture<String> stringCompletableFuture = asyncString();
return stringCompletableFuture.runAfterBoth(asyncString(), () -> {
logger.info("任務全部執行結束");
});
}
private static String executeMethod(String param) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//System.out.println("executeMethod -- > " + param);
logger.info("executeMethod -- > " + param);
return param;
}
}