문홍의 공부장

[Java] 비동기 작업에 사용되는 CompletableFuture 본문

개발/Java

[Java] 비동기 작업에 사용되는 CompletableFuture

moonong 2024. 3. 4. 23:04
반응형


CompletableFuture 는 기존의 Future 인터페이스의 한계를 보완하기 위해 등장한 클래스이다.

 

Future 인터페이스는 비동기 작업에 대한 결과값을 리턴받기 위해 사용되었으나, 아래와 같은 한계점이 존재한다.

  • 외부에서 완료시킬 수 없고, get(long timeout, TimeUnit unit) 의 timeout 설정으로만 완료 가능
  • 블로킹 코드(get()) 을 통해서만 이후 결과를 처리할 수 있음
  • 여러 Future 를 조합하거나, 예외 처리 할 수 없음

 

CompletableFuture 는 이름 그대로 외부에서 '완료 가능한' Future 이다. 또한, CompletionStage 인터페이스를 구현하여 작업의 중첩, 완료 후 콜백(Future 간 조합)을 가능하게 하였다.

public class CompletableFuture<T> implements Future<T>, CompletionStage<T> {
...
}

 

CompletableFuture가 갖는 작업의 종류는 크게 다음과 같이 구분할 수 있다.

  • 비동기 작업 실행
    • runAsync: 반환값이 없는 경우
    • supplyAsync: 반환값이 있는 경우
  • 작업 콜백
    • thenApply
      • 반환 값을 받아서 다른 값을 반환함
      • 함수형 인터페이스 Function을 파라미터로 받음
    • thenAccpet
      • 반환 값을 받아 처리하고 값을 반환하지 않음
      • 함수형 인터페이스 Consumer를 파라미터로 받음
    • thenRun
      • 반환 값을 받지 않고 다른 작업을 실행함
      • 함수형 인터페이스 Runnable을 파라미터로 받음
  • 작업 조합
    • thenCompose
      • 두 작업이 이어서 실행하도록 조합하며, 앞선 작업의 결과를 받아서 사용할 수 있음
      • 함수형 인터페이스 Function을 파라미터로 받음
    • thenCombine
      • 두 작업을 독립적으로 실행하고, 둘 다 완료되었을 때 콜백을 실행함
      • 함수형 인터페이스 Function을 파라미터로 받음
    • allOf
      • 여러 작업들을 동시에 실행하고, 모든 작업 결과에 콜백을 실행함
    • anyOf
      • 여러 작업들 중에서 가장 빨리 끝난 하나의 결과에 콜백을 실행함
  • 예외 처리
    • exeptionally
      • 발생한 에러를 받아서 예외를 처리함
      • 함수형 인터페이스 Function을 파라미터로 받음
    • handle, handleAsync
      • (결과값, 에러)를 반환받아 에러가 발생한 경우와 아닌 경우 모두를 처리할 수 있음
      • 함수형 인터페이스 BiFunction을 파라미터로 받음
CompletableFuture  
        .runAsync(() -> doSomething(), taskExecutor)  
        .thenRun(() -> doSomething2())  
        .exceptionally(e -> { handleError(e);  
            return null;  
            });

References.

반응형