Java

함수 호출 관점에서 동기/비동기, Blocking/Non-blocking

Hyung1 2024. 1. 20. 19:16
728x90
반응형

공부한 것 기록하기

함수 호출 관점에서 동기와 비동기

함수형 인터페이스

  • 함수형 프로그래밍을 지원하기 위해 java8 부터 도입
  • 1개의 추상메서드를 갖고 있는 인터페이스
  • 함수를 1급 객체로 사용할 수 있다.
    • 함수를 변수에 할당하거나 인자로 전달하고 반환값으로 사용 가능
  • Function, Consumer, Suppier, Runnable등
  • 함수형 인터페이스를 구현한 익명 클래스를 람다식으로 변경 가능

  • 함수형 인터페이스는 호출한 쓰레드에서 실행된다.

두 모델의 차이점

A 모델 B 모델
main는 getResult의 결과에 관심이 있다. main은 getResult의 결과에 관심이 없다.
main은 결과를 이용해서 다음 코드를 실행한다. getResult는 결과를 이용해서 함수형 인터페이스를 실행한다.

 

동기 비동기
caller는 callee의 결과에 관심이 있다. caller는 callee의 결과에 관심이 없다.
caller는 결과를 이용해서 action을 수행한다. callee는 결과를 이용해서 callback를 수행한다.

 

함수 호출 관점에서 Blocking과 Non-blocking

두 모델의 공통점

 

A 모델 B 모델
main는 getResult가 결과를 돌려주기 전까지 아무것도 할 수 없다. main은 getResult가 결과를 구하고 callback을 실행하기 전까지 아무것도 할 수 없다.
main은 getResult가 완료될때까지 대기한다. main은 getResult가 완료될 때까지 대기한다.

 

Blocking

  • callee를 호출한 후, callee가 완료되기 전까지 caller가 아무것도 할 수 없다.
  • 제어권을 callee가 가지고 있다.

 

 

 

두 모델의 차이점

 

A 모델 C 모델
getResult를 호출한 후, getResult가 완료되지 않으면 main은 본인의 일을 할 수가 없다. getResult를 호출한 후, getResult가 완료되지 않더라도 main은 본인의 일을 할 수 있다.

 

Non-Blocking

  • caller를 호출한 후, callee가 완료되지 않더라도 caller은 본인의 일을 할 수 있다.
  • 제어권을 caller가 가지고 있다.

Blocking vs Non-blocking

Bloking Non-blocking
caller는 callee가 완료될때까지 대기한다. caller는 callee를 기다리지 않고 본인의 일을 한다.
제어권을 caller가 가지고 있다. 제어권을 caller가 가지고 있다.
caller와 다른 별도의 thread가 필요하지 않다.(혹은 thread를 추가로 쓸 수도 있다) caller와 다른 별도의 thread가 필요하다.

 

D 모델

D 모델

  • main은 getResult의 결과에 관심이 없다.
    • 비동기이다.
  • getResult를 호출한 후, getResult가 완료되지 않더라도 main은 본인의 일을 할 수 있다.
    • non-blocking이다.
  • 즉, D 모델은 비동기 non-blocking이다.

동기 Blocking vs 비동기 Blocking

함수 호출 모델

  동기 비동기
Blocking caller는 아무 것도 할 수 없는 상태가 된다. 결과를 얻은 후 직접 처리한다. caller는 아무것도 할 수 없는 상태가 된다. 결과는 callee가 처리한다.
Non-blocking caller는 자기 할 일을 할 수 있다, 결과를 얻은 후 직접 처리한다. caller는 자기 할 일을 할 수 있다. 결과는 callee가 처리한다.
728x90
반응형