Spring

[Spring] CompletableFuture

별토끼. 2021. 2. 28. 17:05
반응형

CompletableFuture


public class CFuture {  
public static void main(String\[\] args) throws ExecutionException, InterruptedException {  
CompletableFuture f = new CompletableFuture<>();  
f.completeExceptionally(new RuntimeException());  
//System.out.println(f.get()); - 예외 발생  
}  
}  

백그라운드에서 돌아가는 새로운 Thread 생성하기

  • CompletionStage Class
    하나의 비동기 작업을 수행하고 완료됐을 때 의존적으로 다른 작업 수행할 수 있도록 하는 클래스이다. CompletableFuture가 상속받기때문에 이를 활용가능하다. 또한, 체이닝 형태로 표현이 가능하다.
CompletableFuture
                .runAsync(() -> log.info("runAsync"))
                .thenRun(()->log.info("thenRunAsync"))
                .thenRun(()->log.info("thenRunAsync"));

thenApply, thenCompose, exceptionally

  • thenApply

    stream의 map과 같은 느낌.

  • thenCompose

    반환 시, CompletionStage 타입으로만 변환을 해야한다. stream의 flatmap과 같은 느낌.

    참고: thenApply vs thenCompose

  • exceptionally

    앞 메서드들에서 exception이 발생하면 한꺼번에 이 메서드에서 처리하도록 한다.

@Slf4j
public class CFuture {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture
                .supplyAsync(() -> {
                    log.info("runAsync");
                    if(1==1) throw new RuntimeException();
                    return 1;
                })
                .thenCompose(s -> {
                    log.info("thenRun {}", s);
                    return CompletableFuture.completedFuture(s + 1);
                })
                .thenApply(s2 -> {
                    log.info("thenRun {}", s2);
                    return s2 * 3;
                })
                .exceptionally(e -> -10)
                .thenAccept(s3 -> log.info("thenRun {}", s3));

        log.info("exit");

        ForkJoinPool.commonPool().shutdown();
        ForkJoinPool.commonPool().awaitTermination(10, TimeUnit.SECONDS);
    }
}  
반응형