Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CompletableFuture의 thenApply 메서드와 thenCompose에 관하여(황대선) #183

Open
hwangdaesun opened this issue Jul 10, 2024 · 0 comments

Comments

@hwangdaesun
Copy link
Collaborator

hwangdaesun commented Jul 10, 2024

문제가 무엇인가?

저번 스터디때 thenCompose 메서드의 작동 원리에 대한 질문이 나왔다.

왜 이런 문제를 선정하였는가?

책 예제를 통해 thenCompose 메서드의 작동 원리에 공부할 수 있어 해당 문제를 선정하였다.

자신이 생각한 답변은 무엇인가?

예제)

스크린샷 2024-07-10 오후 5 11 06 스크린샷 2024-07-10 오후 5 11 13

위 그림에서도 알 수 있는 사실이 몇가지 있다

  • thenApply 메서드와 thenCompose 메서드는 동기로 실행된다.
  • supplyAsync 메서드와 thenApply 메서드 그리고 thenCompose 메서드 모두 같은 스레드에서 실행된다.
  • thenApply 메서드는 supplyAsync() 메서드가 끝날 때까지 기다려야하고 theCompose 메서드는 thenApply 메서드가 끝날 때까지 기다려야한다. (블락 상태)
  • 메서드들은 Future를 반환한다.

왜 thenApplyAsync 메서드 대신 thenApply메서드를 사용한 것일까?

이유를 알기 위해서는 두 메서드의 차이부터 알아야한다.

두 메서드의 차이는 실행 동작에 있는 데, thenApply 메서드의 경우 CompletableFuture의 스레드를 사용하고, thenApplyAsync 메서드는 새로운 스레드를 사용합니다.

일반적으로, thenApply 메서드의 경우는 실행 시간이 짧고 빠른 변환을 실행하는 데 적합하고
thenApplyAsync()는 비동기적으로 변환을 적용할 때 적합합니다.(I/O 작업 등)

해당 예제에서는 단순히 값의 변환만 하면 되는 것이기 때문에 thenApply 메서드를 사용하였다.

왜 thenComposeAsync 메서드를 사용하지 않고, thenCompose 메서드를 사용한 것일까?

책에서는 아래와 같이 말한다.

두 번째 CompletableFuture 의 결과가 첫 번째 CompletableFuture 에 의존하므로 두 개의 CompletableFuture 를 하나로 조합하던 thenComposeAsync() 를 사용하던 최종 결과와 실행시간에는 영향을 미치지 않는다.

저는 아래와 같이 이해했습니다.

두 번째 CompletableFuture가 첫 번째 CompletableFuture에 의존하고, 세번째 CompletableFuture에서 두 번째 결과에 의존하기 때문에 thenComposeAsync를 사용해도 applyDiscount 메서드를 수행하는 스레드만 달라질 뿐 결과를 기다려야하는 것은 같기에 실행시간에는 차이가 없고 스레드 전환 오버헤드 때문에 손해다.

그렇다면, thenComposeAsync 메서드를 사용해야할 때는 언제일까?

의문..

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant