Caller와 Callee

  • 함수가 다른 함수를 호출하는 상황
  • Caller : 호출하는 함수
  • Callee : 호출 당하는 함수

함수형 인터페이스

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

Type A

@Slf4j
public class A {
    public static void main(String[] args) {
        log.info("start main");
        var result = getResult();
        var nextValue = result + 1;
        assert nextValue == 1;
        LOGGER.info("Finish main");
    }
    public static int getResult(){
        LOGGER.info("Start getResult");
        try{
            Thread.sleep(1000);
        } catch (InterruptedException e){
            throw new RuntimeException(e);
        }
        var result = 0;
        try{
            return result;
        }finally {
            LOGGER.info("Finish getResult");
        }
    }
  • getResult를 호출하고 값을 ++ 시키고 1과 같은지 체크한다.
  • 이때 1초를 sleep 후 반환하기 때문에 main함수는 최소 1초 이상의 시간이 걸리게 된다.

Type B

@Slf4j
public class B {
    public static void main(String[] args) {
        log.info("start main");
        getResult(new Consumer<Integer>(){
            @Override
            public void accept(Integer integer){
                var nextValue = integer + 1;
                assert nextValue == 1;
            }
        });
        log.info("Finish main");
    }
    public static void getResult(Consumer<Integer> cb){
        log.info("Start getResult");
        try{
            Thread.sleep(1000);
        }catch (InterruptedException e){
            throw new RuntimeException(e);
        }
        var result = 0;
        cb.accept(result);
        log.info("Finish getResult");
    }
  • Consumer라는 함수형 인터페이스를 인자로 넘긴다.
  • result를 반환하지 않고 accept함수를 실행시킨다.
  • A 에서는 main이 직접 getResult()를 호출하지만 B에서는 콜백을 통해 행위를 위임한다.

Type A

  • main이 getResult의 결과에 관심이 있다.
  • main은 결과를 이용해서 다음 코드를 실행한다.

Type B

  • main은 getResult의 결과에 관심이 없다.
  • getResult는 결과를 이용해서 함수형 인터페이스를 실행한다.

동기

  • caller는 callee의 결과에 관심이 있다.
  • caller는 결과를 이용해서 action을 수행한다.

비동기

  • caller는 callee의 결과에 관심이 없다.
  • callee는 결과를 이용해서 callback을 수행한다.

Blocking / Non-blocking

Type A

  • main은 getResult()가 결과를 리턴하기 전까지 아무것도 할 수 없다.
  • main은 getResult()가 완료될 때까지 대기한다.

Type B

  • main은 getResult가 결과를 구하고 callback을 실행하기 전까지 아무것도 할 수 없다.
  • main은 getResult가 완료될 때까지 대기한다.

Blocking

  • callee를 호출한 후, callee가 완료되기 전까지 caller가 아무것도 할 수 없다.
  • 제어권을 callee가 가지고 있다.
  • caller와 다른 별도의 thread가 필요하지 않다.

Non-Blocking

  • callee를 호출한 후, callee가 완료되지 않더라도 caller는 본인의 일을 할 수있다.
  • 제어권을 caller가 가지고 있다.
  • caller와 다른 별도의 thread가 필요하다.
  동기 비동기
Blocking caller는 아무것도 할 수 없는 상태가 된다. 결과를 얻은 후 직접 처리한다. caller는 아무것도 할 수 없는 상태가 된다. 결과는 callee가 처리한다.
Non-blocking caller는 자기 할 일을 할 수 있다. 결과를 얻은 후 직접 처리한다. caller는 자기 할 일을 할 수 있다. 결과는 callee가 처리한다.

 

'웹프로그래밍 > WebFlux' 카테고리의 다른 글

Reactive Programming  (0) 2023.07.21
Reactive manifesto  (0) 2023.07.05
CompletionStage 인터페이스  (0) 2023.07.03
Future 인터페이스  (0) 2023.06.13
blocking과 non-blocking의 차이(I/O 관점)  (0) 2023.06.12

+ Recent posts