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은 항상 비동기적이면서 논블로킹일까? (곽민주) #180

Open
MinjuKwak01 opened this issue Jul 3, 2024 · 0 comments

Comments

@MinjuKwak01
Copy link
Collaborator

문제가 무엇인가?

CompletableFuture은 항상 비동기적이면서 논블로킹일까?

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

CompletableFuture은 비동기적으로 실행되지만 항상 논블로킹임을 보장할 수 없다는 의미에 대해 더 자세히 알아보기 위해

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

동기 vs 비동기 vs 블로킹 vs 논블로킹

image

관점을 어떻게 두느냐에 따라 다르다.

Blocking / Non-blocking : 호출된 함수가 호출한 함수에게 제어권을 바로 주느냐 안주느냐

Sync / Async : 호출된 함수의 종료를 호출한 함수가 처리하느냐, 호출된 함수가 처리하느냐

블로킹 : 함수 A → B로 호출할때, B 함수가 자신이 종료되기 전까지 A함수에게 제어권을 돌려주지 않는 것 (호출하면 제어권이 B로 넘어감)

논 블로킹 : 함수 A → B로 호출할때, B 함수가 바로 A 함수에게 제어권을 넘겨주면서, A 함수가 다른 일을 할 수 있도록 하는 것

동기 : 함수 A → B 로 호출할때, B 함수의 결과를 A 함수가 처리하는 것

비동기적 : 함수 A → B 함수를 호출할 때, B 함수의 결과를 B 함수가 처리하는 것 (callback)

출처 : https://jh-7.tistory.com/25

get() 메서드를 호출하면 작업이 완료될 때까지 현재 스레드가 블록되어서 비동기성을 잃는다. → CompletableFuture은 더 유연하고 강력한 비동기 프로그래밍 지원

CompletableFuture 기본적인 동작방식

  • CompletableFuture는 기본적으로 비동기 작업을 수행하기 위해 ForkJoinPool과 같은 스레드 풀을 사용한다.
  • 비동기 작업을 수행하면서 동시에 결과를 기다리는 동안 현재 스레드를 블로킹하지 않도록 설계되었다.
  • 작업이 비동기적으로 실행되지만, 해당 스레드에서 블로킹 호출이 포함된 경우, 그 스레드는 해당 작업이 완료될 때까지 블로킹된다.

CompletableFuture는 비동기 작업을 수행하기 위해 사용되지만, Future에 구현되어있는 get() 함수를 사용하여 여전히 현재 스레드를 블로킹할 수 있다.

→ 항상 논블로킹임을 보장할 수 없다.

CompletableFuture<String> completableFuture = CompletableFuture
  .supplyAsync(() -> "Baeldung")
  .thenApply(String::toUpperCase);

assertEquals("BAELDUNG", completableFuture.get());

비동기 통신에서는 callback 호출을 통해 계산 결과를 가져오는데, CompletableFuture은 완료 시점에 알려주지 않는다. (자동으로 결과를 알리는 매커니즘이 없다) -> thenApply, thenAccept, thenRun 등의 메서드를 사용하면 콜백 방식과 유사하게 비동기 작업 완료 시 후속 작업을 수행할 수 있다.

필요한 경우에 get() 메서드를 사용하여 호출 스레드에서 결과를 바로 가져올 수 있다.

but get() 메서드는 블로킹 처리를 사용하여 결과를 반환해야 한다. → 결과가 준비될 때까지 호출한 스레드는 멈춰있게 된다.
join() 메서드 또한 블로킹 처리를 사용한다.

비동기면서 논블로킹인 것이 항상 좋은지? -> 특정 상황에서는 get() 메서드를 사용하는 것이 유용하다.
"특정상황"?

  • 테스트 환경에서의 사용
  • 사용자 입력을 기다리거나, 특정 결과가 나오기 전까지는 다음 단계로 진행할 수 없는 경우
  • 비동기 작업의 결과를 동기 작업과 통합해야 하는 경우

https://www.baeldung.com/java-completablefuture-non-blocking

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