Blocking/Non-Blocking, Sync/Async 추가 정리본

1. Sync/Async

1.1. Sync

일련의 작업들이 있다고 가정했을 때 먼저 요청한 작업이 완료될 때까지 기다렸다가 다음 명령을 순차적으로 실행하는 것을 의미한다.

Untitled

  1. Apps #1 애플리케이션에서 aaa.com 이라는 웹 사이트의 첫 페이지를 요청
  2. Apps #1에서는 요청한 정보(HTTP 응답 데이터)를 모두 전달 받을 때 까지 대기
  3. 이전 요청이 완료되면 그 다음 절차를 진행

예시 코드(특정 웹 사이트의 메인 페이지 HTML 페이지 요청 및 응답)

HTML 데이터를 모두 받아오고, response 객체에 응답 저장, 가져온 body 출력

HTML 데이터를 모두 받아오고, response 객체에 응답 저장, 가져온 body 출력

1.2. Async

요청한 작업의 종료를 기다리지 않고 다른 작업을 실행할 수 있는 흐름을 말한다. 요청한 쪽에서는 요청 결과와 무관하게 다음 작업을 진행하는 것이 가능하다. 일련의 Async 작업들은 완료 순서가 보장되지 않는 것이 특징이다.

Untitled

예시 코드

Untitled

  1. HttpClient는 sendAsync()를 이용해 비동기적으로 웹 요청을 하게 되고
  2. 메인 스레드에서는 This is Next를 출력 (1번의 요청 완료와 무관하게 출력)
  3. future와 관련된 로직은 비동기 로직에 대한 콜백 코드
    1. HTTP 응답을 받은 뒤 Body 값만 추출하여 새로운 CompleteableFuture를 생성
    2. thenAccept()는 전달받은 Body 값을 출력
    3. join()은 비동기 로직 실행이 완료될 때까지 메인 스레드에서의 대기 (메인 스레드가 대기를 하지 않고 종료를 해버리면 비동기 로직이 완료되기 전 프로세스 자체가 종료될 수 있음)

Untitled