CompletableFuture 學習記錄

學習參考文章: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;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章