CompletableFuture 시작 2 (CompletableFuture 만들기)

6128 단어 java8자바
CompletableFuture 시작(먼저 Future)
계속

CompletableFuture





그림과 같이 CompletableFurureFuture , CompletionStage 인터페이스를 구현하고 있습니다.CompletionStage 는 Java8에서 도입된 인터페이스.

CompletableFuture는 비동기 처리를 나타내며 사용 가능할 때 결과를 유지합니다.

Future와는 무엇이 다른가?
CompletableFuture
명시적으로 (그 값과 스테이터스를 설정해) 완료할 수 있는 Future입니다.
완료 시 발생하는 종속 함수와 동작을 지원하며 CompletionStage로 사용할 수 있습니다.
CompletableFuture@Oracle

이 「완료시에 발생하는 의존 함수 및 액션을 지원」이 CompletableFuture 의 큰 특징
Future 의 특징인, 「시간이 걸리는 처리로 기다리는 일이 없어진다」에 더해,
다음과 같은 일을 할 수 있다.

처리 결과를 사용할 수 있게 되면,
통지를 발행하거나, 람다 식이나 메소드 참조에 의해 정의된 콜백을 실행하거나 할 수 있다.

기본 사용법


public Future<Double> getDoubleAsync(String variable){
    // 計算結果が保持されるCompletableFutureを作成
    CompletableFuture<Double> futureValue = new CompletableFuture<>();
    new Thread( () -> { // 別スレッドで処理を非同期で実行
        try {
       // 時間のかかる処理
            double price = doSomeLongComputation(variable);
       // 結果の値を設定
            futureValue.complete(price);
        } catch (Exception ex) {
            futureValue.completeExceptionally(ex);
        }
    }).start();
    // 計算を待つことなくFutureを返す
    return futureValue;
}

위 메소드를 호출하는 방법
// 戻り値の型は、Future<Double>
Future<Double> futureValue = getDoubleAsync("test");
try {
    // ここで呼び出す。値が利用可能となっていなければブロックされる
    double value = futureValue.get();
    System.out.printf("value is %.2f%n", value);
} catch (ExecutionException | InterruptedException e) {
    throw new RuntimeException(e);
}

SupplyAsync를 사용하는 경우


CompletableFuture 클래스에는 여러 팩토리 메소드가 있습니다.

supplyAsync(Supplier supplier)
ForkJoinPool.commonPool() 에서 실행되고 있는 태스크가 지정된 공급자를 호출해 취득한 값을 사용해 비동기적으로 완료하는 새로운 CompletableFuture 를 돌려줍니다.
supplyAsync@Oracke
public static Future<Double> getDoubleAsyncHandy(String arg) {
    return CompletableFuture.supplyAsync(() -> doSomeLongComputation(arg));
}
supplyAsync 메소드를 사용하면 위와 같이 간단하게 CompletableFuture 를 쓸 수 있다.

좋은 웹페이지 즐겨찾기