Java 8 (5) - CompletableFuture

김정욱·2021년 6월 13일
0

Java

목록 보기
13/13
post-thumbnail

설명

  • Java에서 비동기(Asynchronous) 프로그래밍을 가능케하는 인터페이스
  • Future을 통해서 어느정도 가능했지만, 콜백 정의 처럼 제한적인 것들이 있기에 이러한 것들을 극복함
  • Future의 한계
    • 외부에서 Future을 완료시킬 수 없었음 --> 취소, 타임아웃 설정 불가능
    • 항상 블로킹 코드(get()) 뒤에 콜백을 수행해야 했다
      : 블로킹 코드(get())를 사용하지 않고서는 결과의 보장이 되는 상황특정할 수 없기 때문
    • 여러 Future를 조합해서 사용할 수 없었다
    • 예외 처리용 API를 제공하지 않았다

주요 인터페이스

[ 비동기 작업 실행 ]

  • 특징
    • 직접 쓰레드를 생성하지 않는다
      --> 내부적으로 ForkJoinPool.commonPool()의 쓰레드를 수행해서 비동기 작업 수행
  • runAsync(Runnable)
    • 반환(return)값없는 경우
  • supplyAsync(Supplier)
    • 반환(return)값있는 경우

[ 콜백 제공 ]

.thenApply(Function)

  • 비동기 로직이 수행된 후 결과값을 받고, 값을 반환(return) 한다
  • Function 이니까 입력값 1개 / 출력값 1개

.thenAccept(Consumer)

  • 비동기 로직이 수행된 후 결과값을 받고, 값을 반환(return)하지 않는다
  • Consumer 니까 입력값 1개 / 출력값 0개

.thenRun(Runnable)

  • 비동기 로직이 수행된 후 결과값을 받지 않고, 값을 반환(return)하지도 않는다
  • Runnable 이니까 입력값 0개 / 출력값 0개

[ 조합하기 ]

thenCompose()

  • 연관성이 있는 2개의 작업처리할 때 사용
  • 해당 작업을 처리한 후 결과를 받아서 다음 비동기 작업을 처리할 때 사용

thenCombine()

  • 연관성이 없는 2개의 작업처리할 때 사용

allOf()

  • 연관성이 없는 다수의 작업수행할 때 사용
  • 각 작업의 반환(return)값같다고 보장할 수 없기 때문반환값을 가지지 않는다
  • 만약 모든 작업의 결과ArrayList로 저장하려면 아래처럼 결과 값에 접근해서 만들어야 한다
    (에러처리의 복잡함 때문에 get()대신 join() 사용)

anyOf()

  • 연관성이 없는 다수의 작업들 중 먼저 끝나는 하나가 있으면 종료하는 방식

[ 예외처리 ]

exceptionally(Function)

  • 비동기 작업을 하는 중에러가 발생했을 때, 에러를 처리하기 위한 용도

handle(BiFunction)

  • 비동기 작업을 하는 중에러가 발생했을 때, 결과 값에러 모두를 처리하기 위한 용도
profile
Developer & PhotoGrapher

0개의 댓글