CompletableFutureクイックスタート


参考内容:join()、get()の違いJava 8新しい非同期プログラミング方式CompletableFuture
サンプル展示
他の非同期実行をCompletebleFutureに変換
ここでは新規スレッドの実行状況をCompletebleFutureで制御し,その実行が完了したかどうかなどを随時把握する.
        CompletableFuture completableFuture = new CompletableFuture();
        AtomicReference startTs = new AtomicReference();
        new Thread(() -> {
            try {
                startTs.set(System.currentTimeMillis());
                Thread.sleep(2000L);
                completableFuture.complete("    ");//    completableFuture             
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        while (!completableFuture.isDone()) {//    completableFuture        
            System.out.println(completableFuture.getNow("     "));//       ,                 "     "( :         "   ")
        }

        System.out.println((System.currentTimeMillis() - startTs.get()) + " ms");
        System.out.println(completableFuture.getNow("     "));

CompletebleFutureをアクティブに構築exceptionally()は異常捕獲の方法であり、後続の例は重複しないが、いずれもこの例と同じである.
        CompletableFuture completableFuture = CompletableFuture.completedFuture("   ").thenApplyAsync(x -> {
            System.out.println("          : " + x);
            System.out.println(1 / 0);
            return "        ,           ";
        }).thenApplyAsync((y) -> {
            System.out.println("          : " + y);
            return "  ,    ";
        }).exceptionally((Throwable ex) -> {//     ex      s         ,s          ,    :“         ,   !”“   ~        ,  ~”
            System.out.println(ex.getMessage());
            return "    ";
        });
        try {
            Thread.sleep(100L);//          100       ,     
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(completableFuture.getNow("     "));
        System.in.read();

いずれかが完成すればよい
ここでcompletableFuture5.get();の結果は、completableFuture1completableFuture2completableFuture3のうち最も早く完了した戻り値である
書き方①
        CompletableFuture completableFuture1 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(1000L);
                System.out.println("completableFuture1");
                return "1";
            } catch (InterruptedException e) {
                e.printStackTrace();
                return "   ";
            }
        });

        CompletableFuture completableFuture2 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(500L);
                System.out.println("completableFuture2");
                return "2";
            } catch (InterruptedException e) {
                e.printStackTrace();
                return "   ";
            }
        });

        CompletableFuture completableFuture3 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(100L);
                System.out.println("completableFuture3");
                return "3";
            } catch (InterruptedException e) {
                e.printStackTrace();
                return "   ";
            }
        });

        CompletableFuture completableFuture4 = completableFuture1.applyToEither(completableFuture2, (x) -> {
            System.out.println("1、2         ");
            return x;
        });

        CompletableFuture completableFuture5 = completableFuture4.applyToEither(completableFuture3, (x) -> {
            System.out.println("1、2、3         ");
            return x;
        });
        System.out.println("completableFuture5      :" + completableFuture5.join());
        System.in.read();

書き方②CompletableFuture.anyOf()の使用

        CompletableFuture[] array = new CompletableFuture[3];
        array[0] = completableFuture1;
        array[1] = completableFuture2;
        array[2] = completableFuture3;

        CompletableFuture fastestOne= CompletableFuture.anyOf(array);// anyOf  ,           CompletableFuture    ,         CompletableFuture   
        System.out.println("fastestOne      :" + fastestOne.join());

PS:CompletableFuture.allOf(array) allOfは、arrayにブロックされたすべてのCompletableFutureが完了しました
thenCombineAsyncとthenComposeAsynccompletableFuture4に含まれる方法の消費時間はそれぞれ500 ms、1000 msである.completableFuture5に含まれる方法の消費時間はそれぞれ600 ms、600 msである.
ここでcompletableFuture4completableFuture5は非同期で実行され、ほぼ同時に開始され、completableFuture4の内部メソッドは非同期であり、completableFuture5の内部メソッドは同期であるため、先に出力されたthenCombineAsyncthenComposeAsyncではなく値を返す.
        CompletableFuture completableFuture1 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(500L);
                System.out.println("completableFuture1");
                return "1";
            } catch (InterruptedException e) {
                e.printStackTrace();
                return "   ";
            }
        });

        CompletableFuture completableFuture2 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(1000L);
                System.out.println("completableFuture2");
                return "2";
            } catch (InterruptedException e) {
                e.printStackTrace();
                return "   ";
            }
        });

        CompletableFuture completableFuture3 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(600L);
                System.out.println("completableFuture3");
                return "3";
            } catch (InterruptedException e) {
                e.printStackTrace();
                return "   ";
            }
        });

        CompletableFuture completableFuture4 = completableFuture1.thenCombineAsync(completableFuture2, (x, y) -> {
            return x.toString() + y.toString();
        });

        CompletableFuture completableFuture5 = completableFuture3.thenComposeAsync((x) -> CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(600L);
                return x + "5";
            } catch (InterruptedException e) {
                e.printStackTrace();
                return "   ";
            }
        }));

        while (!completableFuture5.isDone() || !completableFuture4.isDone()) {
            if (completableFuture5.isDone()) {
                System.out.println(completableFuture5.join());
            }
            if (completableFuture4.isDone()) {
                System.out.println(completableFuture4.join());
            }
        }
        System.out.println(completableFuture5.getNow("  "));