CompletableFuture에 해당하는 글 2

[CompletableFuture][#2] staticMethod

JAVA|2019. 7. 9. 19:00

static 메서드를 어떤 동작들을 하는지 파악 및 정리해보았습니다.

 

일단 알아볼 CompletableFuture static메서드 종류는 

  1. allOf
  2. anyOf
  3. completedFuture
  4. runAsync
  5. supplyAsync

 

먼저 allOf(..)

allOf anyOf와 마찬가지로 여러 개의 CompletableFuture를 args로 받고 있습니다.

소스를 열어보면 설명이 친절하게 달려있습니다(물론 영어..).

필요한 부분 일부만 해석을 해보면..

allOf(..)는

  • CompletableFuture 객체(이제 cf 객체라 줄임)를 반환하며 반환한 cf 객체는 args로 주어진 cfs들이 모두 완료되면 completed 됩니다.
  • 그리고 args로 들어온 cfs 중에 예외가 발생한 경우 CompletaionException으로 감싸서(기존 에러는 cause로 담아) 마지막에 에러로 발생됩니다.//결국 에러를 cf의 응답으로 취급하여 모든 에러 혹은 결과를 기다림
  • 여러 개의 cf들을 다 기다릴 때 사용됩니다.
  • args가 없으면 바로 완료된 cf를 반환합니다.
  • [TODO] andTree 내부 구현을 보면 BiRelay 가 사용되고 있는데 다음에 살펴볼 예정입니다.

 

anyOf(..)는

  • 반환한 cf 객체는 args로 주어진 cfs들 중 어떤 것이라도 완료되면 completed 가 됩니다.
  • 그리고 args로 들어온 cfs 중에 예외가 발생한 경우 CompletaionException으로 감싸서(기존 에러는 cause로 담아) 바로 에러로 발생됩니다.//에러를 응답으로 취급, 응답이 왔기에 즉시 리턴
  • 여러 개 중 하나의 cf를 기다릴 때 사용됩니다..
  • args가 없으면 바로 완료되지 않은 cf를 반환
  • [TODO] 3개 중 2개를 기다려야 한다면 어떻게 해야 하지..?

completedFuture(value)는

  • arg value를 result 필드로 들고 있고 완료되어있는 cf 객체를 반환

runAsync(Runnable,@Optional Executor)는

  • async 하게 처리되고 있는 cf 객체를 반환하며(runnable이니 result는 null)
  • executor가 지정되어있지 않으면 ForkJoinPool을 통해 running 된다.
  • 내부 코드에서는 cf에 innerClass인 AsyncRun 사용

  • [TODO] java.util.concurrent.ForkJoinPool

 

supplyAsync(Runnable,@Optional Executor)는

 

  • async 하게 처리되고 있는 cf 객체를 반환하며(supplier를 받으니 result는 U )
  • executor가 지정되어있지 않으면 ForkJoinPool을 통해 running 됩니다.
  • 내부 코드에서는 cf에 innerClass인 AsyncSuppy 사용

 

이번에는 먼저 cf에 static 메서드만 알아보았고

다음에는 일반 메서드들 및 내부에서 많이 사용하고 있는 메서드들을 주로 파악할 예정입니다.

댓글()

[CompletableFuture][#1] 정리시작

JAVA|2019. 7. 3. 18:30

업무상 JDK7까지 밖에 쓸수없어 이후 나온것들을.. 다 파악하지는 못하지만

블로그 및 세미나를 보며 흥미로운 항목중 CompletableFuture이 있었습니다.

 

가장 흥미로웠던 부분은 병렬처리 flow를 쉽게 개발할수 있게 해줄수 있겠다는것!

 

여기서 사용할 예는

RunA async실행 후 RunB1 RunB2 병렬 수행, RunC 실행 되는 케이스를 해보려고 한다.

 

 

그전에 클래스를 조금 살펴보면

Future와 CompletationStatge 인터페이스를 구현하고 있다.

 

Future는 지금까지 이해하고 사용하는 부분으로는 caller 쓰레드가 async 한 작업을 위해 다른 쓰레드에 일을 넘길경우 결과값 및 실행 종료 여부를 파악할수 있도록 사용하는 클래스로 생각해왔으며

결과값을 얻거나 일정 시간동안 결과값이 set 될때까지 대기하는 get(), get(time) 과 

여부를 알수 있는 isDone() 등이 했다.

 

여기서 CompletationStatge는 처음 접한 인터페이스 인데 역시나 JDK8에 새로 추가된 인터페이스 였다.

선언 되어있는 메소드너무 많다..

thenApply(Function )

thenApplyAsync(Function )

thenAccept(Consumer)

thenAcceptAsync(Consumer)

thenRun(Runnable)

thenRunAsync(Runnable)

thenCombine(CompletaionStage, BiFunction)

thenCombineAsync(CompletaionStage, BiFunction)

thenAcceptBoth(CompletaionStage, BiConsumer)

thenAcceptBothAsync(CompletaionStage, BiConsumer)

...

handle(BiFunction)

handleAsync(BiFunction)

 

대부분 then** 인 만큼 앞에 작업을 수행후 수행할 작업들을 정의하는 것으로 파악 된다.

(다음에는 각 의미를 알아보고 정리할 예정)

 

CompletableFuture 는 다양한 static 메소드를 지원하여 다양한 방식을 지원

(하나의 runnable을 받아 async로 실행하거나, 특정 executor를 받는다던지, 여러 runnable을 받아 일괄로 실행한다던지)

allOf

anyOf

completedFuture

runAsync

supplyAsync

 

(다음에는 각 의미를 알아보고 정리할 예정)

 

 

댓글()