非同步任務編排CompletableFuture

歲月呀發表於2020-12-14

貼下非同步編排隨手寫的測試程式碼,僅用於記錄。 

/**
 * 非同步編排測試,多工編排時使用
 * @author 86156
 */
public class AsynTest {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 1、非同步執行,沒有返回結果
        CompletableFuture<Void> completableFuture1 = CompletableFuture.runAsync(new Runnable01());
        // 2、非同步執行,指定執行緒池執行,沒有返回結果
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        CompletableFuture<Void> completableFuture2 = CompletableFuture.runAsync(new Runnable01(), executorService);

        // 3、非同步執行,獲取返回結果
        FutureTask<String> futureTask = new FutureTask<>(new Callable01());
        CompletableFuture<String> completableFuture3 = CompletableFuture.supplyAsync(() -> {
            System.out.println("非同步執行任務,帶返回值");
            return "success";
        });
        System.out.println(completableFuture3.get()); // success

        // 4、非同步執行,指定執行緒池執行,獲取返回結果
        CompletableFuture<String> completableFuture4 = CompletableFuture.supplyAsync(() -> {
            System.out.println("非同步執行任務,指定執行緒池,帶返回值");
            return "success";
        });
        System.out.println(completableFuture4.get()); // success

        // 關閉執行緒池
        executorService.shutdown();

        // 任務完成時執行邏輯:whenCompleteAsync,異常處理exceptionally
        CompletableFuture.supplyAsync(() -> {
            System.out.println("非同步執行任務,執行完成繼續執行其他邏輯");
            return "success";
        }).whenCompleteAsync((result, exception) -> {
            if (exception == null) {
                int i = 10 / 0;
                System.out.println("上一步執行任務結果是:" + result);
            }
        }).exceptionally(e -> {
            System.out.println("列印異常" + e.getMessage());
            return e.getMessage();
        });

        // 任務完成時執行邏輯:handle
        CompletableFuture.supplyAsync(() -> {
            System.out.println("非同步執行任務,,,");
            return "hello";
        }).handle((res, err) -> {
            if (err == null) {
                System.out.println(res + " Tom!");
            }
            return 0;
        });

        // 序列化執行任務:thenApply,thenRun,thenAccept
//        CompletableFuture.supplyAsync(() -> {
//            System.out.println("非同步執行任務,,,");
//            return "hello";
//        }).thenAccept(res -> System.out.println("執行完會沒有返回結果,列印執行結果:" + res));
//        CompletableFuture.supplyAsync(() -> {
//            System.out.println("非同步執行任務,,,");
//            return "hello";
//        }).thenApply(res -> {
//            System.out.println("執行完會有返回結果,列印執行結果:" + res);
//            return  0;
//        });
//        CompletableFuture.supplyAsync(() -> {
//            System.out.println("非同步執行任務,,,");
//            return "hello";
//        }).thenRun(() -> {
//            System.out.println("thenRun無法獲取上個任務的結果");
//        });

        // 兩個任務都要完成
        completableFuture1.thenCombineAsync(completableFuture2, (f1, f2) -> {
            System.out.println(f1 + ":" + f2 + "ret");
            return 0;
        });

        // 兩個任務任何一個完成
        completableFuture1.runAfterEitherAsync(completableFuture2, () -> {
            System.out.println("任何一個任務執行成功都執行這裡。。。。。。。");
        });

        // 所有任何都要執行
        CompletableFuture.allOf(completableFuture1, completableFuture2, completableFuture3).handle((res, err) ->
            {
                if (err == null) {
                    System.out.println("成功執行所有任務");
                }
                return 0;
            }
        );

        // 任何一個任何執行
        CompletableFuture.anyOf(completableFuture1, completableFuture2, completableFuture3).handle((res, err) ->
            {
                if (err == null) {
                    System.out.println("任何一個任何執行");
                }
                return 0;
            }
        );

    }

    public static class Runnable01 implements Runnable {
        @Override
        public void run() {
            System.out.println("非同步執行執行緒,執行緒id:" + Thread.currentThread().getId());
        }
    }

    public static class Callable01 implements Callable<String> {
        @Override
        public String call() throws Exception {
            System.out.println("callable方式執行執行緒");
            return "success";
        }
    }

}

 

相關文章